diff options
author | Dominik Picheta <dominikpicheta@gmail.com> | 2017-11-24 16:29:34 +0000 |
---|---|---|
committer | Dominik Picheta <dominikpicheta@gmail.com> | 2017-11-24 16:29:34 +0000 |
commit | e5a27c96fbd8a3bdd48b1974595381c1a335aaa5 (patch) | |
tree | cd37e1d8d4a324199e38f6ed82f2e35bb532b5d0 | |
parent | 66d7091b7994b3e5a1d4ede1b50cbf59780c9c16 (diff) | |
download | Nim-e5a27c96fbd8a3bdd48b1974595381c1a335aaa5.tar.gz |
Implements nativesockets.accept.
-rw-r--r-- | changelog.md | 2 | ||||
-rw-r--r-- | lib/pure/nativesockets.nim | 17 | ||||
-rw-r--r-- | lib/pure/net.nim | 10 |
3 files changed, 20 insertions, 9 deletions
diff --git a/changelog.md b/changelog.md index cc6732fc1..a9212efbd 100644 --- a/changelog.md +++ b/changelog.md @@ -21,6 +21,8 @@ field to help distinguish between ``Event.Error`` events. - The `AsyncFD` type now reflects the fact that the underlying FD is registered in the async dispatcher. +- Implemented an `accept` proc that works on a `SocketHandle` in + ``nativesockets``. - The overloading rules changed slightly so that constrained generics are preferred over unconstrained generics. (Bug #6526) - It is now possible to forward declare object types so that mutually diff --git a/lib/pure/nativesockets.nim b/lib/pure/nativesockets.nim index 6c8701843..790ad627d 100644 --- a/lib/pure/nativesockets.nim +++ b/lib/pure/nativesockets.nim @@ -187,12 +187,12 @@ proc toSockType*(protocol: Protocol): SockType = proc newNativeSocket*(domain: Domain = AF_INET, sockType: SockType = SOCK_STREAM, protocol: Protocol = IPPROTO_TCP): SocketHandle = - ## Creates a new socket; returns `InvalidSocket` if an error occurs. + ## Creates a new socket; returns `osInvalidSocket` if an error occurs. socket(toInt(domain), toInt(sockType), toInt(protocol)) proc newNativeSocket*(domain: cint, sockType: cint, protocol: cint): SocketHandle = - ## Creates a new socket; returns `InvalidSocket` if an error occurs. + ## Creates a new socket; returns `osInvalidSocket` if an error occurs. ## ## Use this overload if one of the enums specified above does ## not contain what you need. @@ -666,6 +666,19 @@ proc selectWrite*(writefds: var seq[SocketHandle], pruneSocketSet(writefds, (wr)) +proc accept*(fd: SocketHandle): (SocketHandle, string) = + ## Accepts a new client connection. + ## + ## Returns (osInvalidSocket, "") if an error occurred. + var sockAddress: Sockaddr_in + var addrLen = sizeof(sockAddress).SockLen + var sock = accept(fd, cast[ptr SockAddr](addr(sockAddress)), + addr(addrLen)) + if sock == osInvalidSocket: + return (osInvalidSocket, "") + else: + return (sock, $inet_ntoa(sockAddress.sin_addr)) + when defined(Windows): var wsa: WSAData if wsaStartup(0x0101'i16, addr wsa) != 0: raiseOSError(osLastError()) diff --git a/lib/pure/net.nim b/lib/pure/net.nim index b8d05642b..5c162317e 100644 --- a/lib/pure/net.nim +++ b/lib/pure/net.nim @@ -753,10 +753,8 @@ proc acceptAddr*(server: Socket, client: var Socket, address: var string, ## flag is specified then this error will not be raised and instead ## accept will be called again. assert(client != nil) - var sockAddress: Sockaddr_in - var addrLen = sizeof(sockAddress).SockLen - var sock = accept(server.fd, cast[ptr SockAddr](addr(sockAddress)), - addr(addrLen)) + let ret = accept(server.fd) + let sock = ret[0] if sock == osInvalidSocket: let err = osLastError() @@ -764,6 +762,7 @@ proc acceptAddr*(server: Socket, client: var Socket, address: var string, acceptAddr(server, client, address, flags) raiseOSError(err) else: + address = ret[1] client.fd = sock client.isBuffered = server.isBuffered @@ -776,9 +775,6 @@ proc acceptAddr*(server: Socket, client: var Socket, address: var string, let ret = SSLAccept(client.sslHandle) socketError(client, ret, false) - # Client socket is set above. - address = $inet_ntoa(sockAddress.sin_addr) - when false: #defineSsl: proc acceptAddrSSL*(server: Socket, client: var Socket, address: var string): SSLAcceptResult {. |