@@ -701,6 +701,8 @@ const socket_error = uintptr(^uint32(0))
701
701
//sys WSACleanup() (err error) [failretval==socket_error] = ws2_32.WSACleanup
702
702
//sys WSAIoctl(s Handle, iocc uint32, inbuf *byte, cbif uint32, outbuf *byte, cbob uint32, cbbr *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) [failretval==socket_error] = ws2_32.WSAIoctl
703
703
//sys socket(af int32, typ int32, protocol int32) (handle Handle, err error) [failretval==InvalidHandle] = ws2_32.socket
704
+ //sys sendto(s Handle, buf []byte, flags int, to unsafe.Pointer, tolen int32) (err error) [failretval==socket_error] = ws2_32.sendto
705
+ //sys recvfrom(s Handle, buf []byte, flags int, from *RawSockaddrAny, fromlen *int) (n int, err error) [failretval==-1] = ws2_32.recvfrom
704
706
//sys Setsockopt(s Handle, level int32, optname int32, optval *byte, optlen int32) (err error) [failretval==socket_error] = ws2_32.setsockopt
705
707
//sys Getsockopt(s Handle, level int32, optname int32, optval *byte, optlen *int32) (err error) [failretval==socket_error] = ws2_32.getsockopt
706
708
//sys bind(s Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socket_error] = ws2_32.bind
@@ -1129,10 +1131,26 @@ func NsecToTimespec(nsec int64) (ts Timespec) {
1129
1131
// TODO(brainman): fix all needed for net
1130
1132
1131
1133
func Accept (fd Handle ) (nfd Handle , sa Sockaddr , err error ) { return 0 , nil , syscall .EWINDOWS }
1134
+
1132
1135
func Recvfrom (fd Handle , p []byte , flags int ) (n int , from Sockaddr , err error ) {
1133
- return 0 , nil , syscall .EWINDOWS
1136
+ var rsa RawSockaddrAny
1137
+ l := int (unsafe .Sizeof (rsa ))
1138
+ n , err = recvfrom (fd , p , flags , & rsa , & l )
1139
+ if err != nil {
1140
+ return
1141
+ }
1142
+ from , err = rsa .Sockaddr ()
1143
+ return
1134
1144
}
1135
- func Sendto (fd Handle , p []byte , flags int , to Sockaddr ) (err error ) { return syscall .EWINDOWS }
1145
+
1146
+ func Sendto (fd Handle , p []byte , flags int , to Sockaddr ) (err error ) {
1147
+ ptr , l , err := to .sockaddr ()
1148
+ if err != nil {
1149
+ return err
1150
+ }
1151
+ return sendto (fd , p , flags , ptr , l )
1152
+ }
1153
+
1136
1154
func SetsockoptTimeval (fd Handle , level , opt int , tv * Timeval ) (err error ) { return syscall .EWINDOWS }
1137
1155
1138
1156
// The Linger struct is wrong but we only noticed after Go 1.
0 commit comments