|
@@ -194,8 +194,12 @@ _send_tcp :: proc(skt: TCP_Socket, buf: []byte) -> (bytes_written: int, err: Net
|
|
|
for bytes_written < len(buf) {
|
|
|
limit := min(int(max(i32)), len(buf) - bytes_written)
|
|
|
remaining := buf[bytes_written:][:limit]
|
|
|
- res, res_err := os.send(os.Socket(skt), remaining, 0)
|
|
|
- if res_err != nil {
|
|
|
+ res, res_err := os.send(os.Socket(skt), remaining, os.MSG_NOSIGNAL)
|
|
|
+ if res_err == os.EPIPE {
|
|
|
+ // EPIPE arises if the socket has been closed remotely.
|
|
|
+ err = TCP_Send_Error.Connection_Closed
|
|
|
+ return
|
|
|
+ } else if res_err != nil {
|
|
|
err = TCP_Send_Error(os.is_platform_error(res_err) or_else -1)
|
|
|
return
|
|
|
}
|
|
@@ -210,8 +214,12 @@ _send_udp :: proc(skt: UDP_Socket, buf: []byte, to: Endpoint) -> (bytes_written:
|
|
|
for bytes_written < len(buf) {
|
|
|
limit := min(1<<31, len(buf) - bytes_written)
|
|
|
remaining := buf[bytes_written:][:limit]
|
|
|
- res, res_err := os.sendto(os.Socket(skt), remaining, 0, cast(^os.SOCKADDR)&toaddr, i32(toaddr.len))
|
|
|
- if res_err != nil {
|
|
|
+ res, res_err := os.sendto(os.Socket(skt), remaining, os.MSG_NOSIGNAL, cast(^os.SOCKADDR)&toaddr, i32(toaddr.len))
|
|
|
+ if res_err == os.EPIPE {
|
|
|
+ // EPIPE arises if the socket has been closed remotely.
|
|
|
+ err = UDP_Send_Error.Not_Socket
|
|
|
+ return
|
|
|
+ } else if res_err != nil {
|
|
|
err = UDP_Send_Error(os.is_platform_error(res_err) or_else -1)
|
|
|
return
|
|
|
}
|