summaryrefslogtreecommitdiff
path: root/src/net
diff options
context:
space:
mode:
authorRon Hashimoto <mail@h2so5.net>2014-10-10 09:21:32 +1100
committerRon Hashimoto <mail@h2so5.net>2014-10-10 09:21:32 +1100
commit24815bcce4ab6e6c7cf41f68d2b3b86561e0e2b6 (patch)
tree47fc4c870fc3386c7f06d40e32e694f2714218da /src/net
parent0e62ef01c88fca69015123193863f332852f8f0b (diff)
downloadgo-24815bcce4ab6e6c7cf41f68d2b3b86561e0e2b6.tar.gz
net: disable SIO_UDP_CONNRESET behavior on windows.
Fixes issue 5834. LGTM=alex.brainman R=golang-codereviews, bradfitz, alex.brainman, mikioh.mikioh, in60jp, iant CC=golang-codereviews https://codereview.appspot.com/149510043 Committer: Alex Brainman <alex.brainman@gmail.com>
Diffstat (limited to 'src/net')
-rw-r--r--src/net/fd_windows.go12
-rw-r--r--src/net/udp_test.go36
2 files changed, 48 insertions, 0 deletions
diff --git a/src/net/fd_windows.go b/src/net/fd_windows.go
index 6d69e0624..f3a534a1d 100644
--- a/src/net/fd_windows.go
+++ b/src/net/fd_windows.go
@@ -294,6 +294,18 @@ func (fd *netFD) init() error {
fd.skipSyncNotif = true
}
}
+ // Disable SIO_UDP_CONNRESET behavior.
+ // http://support.microsoft.com/kb/263823
+ switch fd.net {
+ case "udp", "udp4", "udp6":
+ ret := uint32(0)
+ flag := uint32(0)
+ size := uint32(unsafe.Sizeof(flag))
+ err := syscall.WSAIoctl(fd.sysfd, syscall.SIO_UDP_CONNRESET, (*byte)(unsafe.Pointer(&flag)), size, nil, 0, &ret, nil, 0)
+ if err != nil {
+ return os.NewSyscallError("WSAIoctl", err)
+ }
+ }
fd.rop.mode = 'r'
fd.wop.mode = 'w'
fd.rop.fd = fd
diff --git a/src/net/udp_test.go b/src/net/udp_test.go
index e1778779c..a102acf6c 100644
--- a/src/net/udp_test.go
+++ b/src/net/udp_test.go
@@ -9,6 +9,7 @@ import (
"runtime"
"strings"
"testing"
+ "time"
)
func TestResolveUDPAddr(t *testing.T) {
@@ -34,6 +35,41 @@ func TestResolveUDPAddr(t *testing.T) {
}
}
+func TestReadFromUDP(t *testing.T) {
+ ra, err := ResolveUDPAddr("udp", "127.0.0.1:7")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ la, err := ResolveUDPAddr("udp", "127.0.0.1:0")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ c, err := ListenUDP("udp", la)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer c.Close()
+
+ _, err = c.WriteToUDP([]byte("a"), ra)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ err = c.SetDeadline(time.Now().Add(100 * time.Millisecond))
+ if err != nil {
+ t.Fatal(err)
+ }
+ b := make([]byte, 1)
+ _, _, err = c.ReadFromUDP(b)
+ if err == nil {
+ t.Fatal("ReadFromUDP should fail")
+ } else if !isTimeout(err) {
+ t.Fatal(err)
+ }
+}
+
func TestWriteToUDP(t *testing.T) {
switch runtime.GOOS {
case "plan9":