使用与Windows窗口

我目前正在开发一个服务器/客户端项目,在那里我需要使用没有净包的套接字。 所以我使用我在syscall包上创build的POSIX函数。 我的服务器程序在Linux上,我的客户端在Windows上(8)。

所以基本上,我想连接客户端到服务器。 问题是,当客户端要写在套接字说:“致命的错误:不支持的Windows”。

客户:

package main import ( "fmt" "os" "runtime" s "syscall" ) const ( MAXSIZE = 500 PORT = 3000 ) var ( ADDR = [4]byte{10, 8, 0, 1} ) func Dial() (s.Handle, s.SockaddrInet4, error) { var sa s.SockaddrInet4 = s.SockaddrInet4{Port: PORT, Addr: ADDR} var d s.WSAData var sd s.Handle // a previous error told me to this if runtime.GOOS == "windows" { err := s.WSAStartup(uint32(0x202), &d) if err != nil { return sd, sa, err } } sd, err := s.Socket(s.AF_INET, s.SOCK_STREAM, 0) if err != nil { return sd, sa, err } s.Connect(sd, &sa) return sd, sa, err } func main() { sd, sa, err := Dial() check(err) defer s.Close(sd) _, err = s.Write(sd, make([]byte, 500,42)) check(err) } func check(err error) { if err != nil { fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error()) os.Exit(1) } } 

服务器(效果很好):

  package main import ( "fmt" "io/ioutil" "os" s "syscall" ) const ( PORT = 3000 ) func main() { var sa s.SockaddrInet4 fmt.Println(sa) fd, err := s.Socket(s.AF_INET, s.SOCK_STREAM, 0) if err != nil { check(err) } defer s.Close(fd) if err := s.Bind(fd, &s.SockaddrInet4{Port: PORT, Addr: [4]byte{0, 0, 0, 0}}); err != nil { check(err) } if err := s.Listen(fd, 5); err != nil { check(err) } for { nfd, sa, err := s.Accept(fd) if err != nil { check(err) } go func(nfd int, sa s.Sockaddr) { var n int fmt.Println(sa) defer s.Close(nfd) b := make([]byte, 500) n, err = s.Read(nfd, b) check(err) fmt.Println(n) }(nfd, sa) } } func check(err error) { if err != nil { fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error()) os.Exit(1) } } 

(如果我的英语不好,我是法国人)

像JimB提到的那样,在Windows上, WSASend被用来通过网络发送数据。

所以基本上,你必须改变你的客户端代码是:

  _, err = s.Write(sd, make([]byte, 500,42)) 

至:

 data := make([]byte, 4) buf := &s.WSABuf{ Len: uint32(len(data)), Buf: &data[0], } var sent *uint32 overlapped := s.Overlapped{} croutine := byte(0) err = s.WSASendto(sd, buf, 1, sent, uint32(0), &sa, &overlapped, &croutine) check(err)