X-Git-Url: http://nitlanguage.org diff --git a/lib/socket/socket.nit b/lib/socket/socket.nit index 26d9937..681e239 100644 --- a/lib/socket/socket.nit +++ b/lib/socket/socket.nit @@ -41,9 +41,9 @@ end # Simple communication stream with a remote socket class TCPStream super Socket - super BufferedIStream - super OStream - super PollableIStream + super BufferedReader + super Writer + super PollableReader # Real canonical name of the host to which `self` is connected var host: String @@ -66,7 +66,11 @@ class TCPStream closed = true return end - socket.setsockopt(new NativeSocketOptLevels.socket, new NativeSocketOptNames.reuseaddr, 1) + if not socket.setsockopt(new NativeSocketOptLevels.socket, new NativeSocketOptNames.reuseaddr, 1) then + end_reached = true + closed = true + return + end var hostname = socket.gethostbyname(host) addrin = new NativeSocketAddrIn.with_hostent(hostname, port) @@ -107,7 +111,7 @@ class TCPStream fun ready_to_read(timeout: Int): Bool do if _buffer_pos < _buffer.length then return true - if eof then return false + if end_reached then return false var events = [new NativeSocketPollValues.pollin] return pollin(events, timeout).length != 0 end @@ -168,14 +172,17 @@ class TCPStream if closed then return if socket.close >= 0 then closed = true + end_reached = true end end # Send the data present in the socket buffer fun flush do - socket.setsockopt(new NativeSocketOptLevels.tcp, new NativeSocketOptNames.tcp_nodelay, 1) - socket.setsockopt(new NativeSocketOptLevels.tcp, new NativeSocketOptNames.tcp_nodelay, 0) + if not socket.setsockopt(new NativeSocketOptLevels.tcp, new NativeSocketOptNames.tcp_nodelay, 1) or + not socket.setsockopt(new NativeSocketOptLevels.tcp, new NativeSocketOptNames.tcp_nodelay, 0) then + closed = true + end end end @@ -193,8 +200,11 @@ class TCPServer socket = new NativeSocket.socket(new NativeSocketAddressFamilies.af_inet, new NativeSocketTypes.sock_stream, new NativeSocketProtocolFamilies.pf_null) assert not socket.address_is_null - socket.setsockopt(new NativeSocketOptLevels.socket, new NativeSocketOptNames.reuseaddr, 1) - addrin = new NativeSocketAddrIn.with(port, new NativeSocketAddressFamilies.af_inet) + if not socket.setsockopt(new NativeSocketOptLevels.socket, new NativeSocketOptNames.reuseaddr, 1) then + closed = true + return + end + addrin = new NativeSocketAddrIn.with_port(port, new NativeSocketAddressFamilies.af_inet) address = addrin.address # Bind it