net: use better error messages on windows

Fixes #4320.

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/6810064
diff --git a/src/pkg/net/fd_unix.go b/src/pkg/net/fd_unix.go
index 828e998..ee82ead 100644
--- a/src/pkg/net/fd_unix.go
+++ b/src/pkg/net/fd_unix.go
@@ -7,7 +7,6 @@
 package net
 
 import (
-	"errors"
 	"io"
 	"os"
 	"runtime"
@@ -346,8 +345,6 @@
 	return err
 }
 
-var errClosing = errors.New("use of closed network connection")
-
 // Add a reference to this fd.
 // If closing==true, pollserver must be locked; mark the fd as closing.
 // Returns an error if the fd cannot be used.
diff --git a/src/pkg/net/fd_windows.go b/src/pkg/net/fd_windows.go
index f94f082..040439a 100644
--- a/src/pkg/net/fd_windows.go
+++ b/src/pkg/net/fd_windows.go
@@ -196,11 +196,12 @@
 	}
 	// Wait for our request to complete.
 	var r ioResult
-	var cancelled bool
+	var cancelled, timeout bool
 	select {
 	case r = <-o.resultc:
 	case <-timer:
 		cancelled = true
+		timeout = true
 	case <-o.fd.closec:
 		cancelled = true
 	}
@@ -220,7 +221,11 @@
 		// Wait for IO to be canceled or complete successfully.
 		r = <-o.resultc
 		if r.err == syscall.ERROR_OPERATION_ABORTED { // IO Canceled
-			r.err = syscall.EWOULDBLOCK
+			if timeout {
+				r.err = errTimeout
+			} else {
+				r.err = errClosing
+			}
 		}
 	}
 	if r.err != nil {
@@ -312,8 +317,6 @@
 	return syscall.Connect(fd.sysfd, ra)
 }
 
-var errClosing = errors.New("use of closed network connection")
-
 // Add a reference to this fd.
 // If closing==true, mark the fd as closing.
 // Returns an error if the fd cannot be used.
diff --git a/src/pkg/net/net.go b/src/pkg/net/net.go
index 9ebcdbe..d6563e0 100644
--- a/src/pkg/net/net.go
+++ b/src/pkg/net/net.go
@@ -221,6 +221,8 @@
 
 var errTimeout error = &timeoutError{}
 
+var errClosing = errors.New("use of closed network connection")
+
 type AddrError struct {
 	Err  string
 	Addr string