Golang在Linux环境下的POSIX风格socket编程

前端之家收集整理的这篇文章主要介绍了Golang在Linux环境下的POSIX风格socket编程前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

这里给出一个服务端和客户端,服务端可以接受多个连接,并且利用Go的杀手特性go和channel来替代select进行数据的接收。


服务端:

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. . "syscall"
  6. )
  7.  
  8. func RecvRoutine(sockfd int,session chan string) {
  9. var buffer []byte = make([]byte,3000)
  10. for {
  11. if length,err := Read(sockfd,buffer); err == nil {
  12. session <- string(buffer[:length])
  13. }
  14. }
  15. }
  16.  
  17. func main() {
  18. var (
  19. serversock int
  20. serveraddr SockaddrInet4
  21. session chan string = make(chan string,1000)
  22. err error
  23. )
  24.  
  25. if serversock,err = Socket(AF_INET,SOCK_STREAM,IPPROTO_IP); err != nil {
  26. fmt.Println("Server Socket() called error:",err.Error())
  27. return
  28. }
  29. defer Shutdown(serversock,SHUT_RDWR)
  30.  
  31. serveraddr.Addr = [4]byte{127,1}
  32. serveraddr.Port = 3000
  33.  
  34. if err = Bind(serversock,&serveraddr); err != nil {
  35. fmt.Println("Server Bind() called error:",err.Error())
  36. return
  37. }
  38.  
  39. if err = Listen(serversock,SOMAXCONN); err != nil {
  40. fmt.Println("Server Listen() called error:",err.Error())
  41. return
  42. }
  43.  
  44. go func() {
  45. for {
  46. fmt.Println(<-session)
  47. }
  48. }()
  49.  
  50. fmt.Println("server is listening at port 3000...")
  51. for {
  52. if clientsock,_,err := Accept(serversock); err == nil {
  53. go RecvRoutine(clientsock,session)
  54. }
  55. }
  56. }


客户端:

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. . "syscall"
  6. )
  7.  
  8. func main() {
  9. var (
  10. clientsock int
  11. serveraddr SockaddrInet4
  12. err error
  13. )
  14.  
  15. if clientsock,IPPROTO_IP); err != nil {
  16. fmt.Println("Client Socket() called error:",err.Error())
  17. return
  18. }
  19. defer Shutdown(clientsock,1}
  20. serveraddr.Port = 3000
  21.  
  22. if err = Connect(clientsock,&serveraddr); err != nil {
  23. fmt.Println("Client Connect() called error:",err.Error())
  24. return
  25. }
  26.  
  27. var msg string
  28. for {
  29. fmt.Scanf("%s\r\n",&msg)
  30. if msg != "\r" && msg != "\n" {
  31. if _,err = Write(clientsock,[]byte(msg)); err != nil {
  32. fmt.Println("Send() error:",err.Error())
  33. }
  34. }
  35. }
  36. }



如果转载请注明出处:http://blog.csdn.net/gophers

猜你在找的Go相关文章