@@ -301,15 +301,10 @@ proc bindSocket*(sock: AsyncFD, localAddress: TransportAddress, reuseAddr = true
301
301
# Setting SO_REUSEADDR option we are able to reuse ports using the 0.0.0.0 address (or equivalent)
302
302
setSockOptInt (SocketHandle (sock), SOL_SOCKET , SO_REUSEADDR , 1 )
303
303
304
- var raddress =
305
- when defined (windows):
306
- windowsAnyAddressFix (localAddress)
307
- else :
308
- localAddress
309
304
var
310
305
localAddr: Sockaddr_storage
311
306
localAddrLen: SockLen
312
- raddress .toSAddr (localAddr, localAddrLen)
307
+ localAddress .toSAddr (localAddr, localAddrLen)
313
308
if bindSocket (SocketHandle (sock), cast [ptr SockAddr ](addr localAddr), localAddrLen) != 0 :
314
309
raiseTransportOsError (osLastError ())
315
310
@@ -718,6 +713,13 @@ elif defined(windows):
718
713
sizeof (saddr).SockLen ) != 0 'i32 :
719
714
result = false
720
715
716
+ proc isDomainSet (sock: AsyncFD ): bool =
717
+ try :
718
+ discard getSockDomain (SocketHandle (sock))
719
+ true
720
+ except CatchableError as ex:
721
+ false
722
+
721
723
proc connect * (sock: AsyncFD ,
722
724
address: TransportAddress ,
723
725
bufferSize = DefaultStreamBufferSize ,
@@ -734,7 +736,6 @@ elif defined(windows):
734
736
var
735
737
saddr: Sockaddr_storage
736
738
slen: SockLen
737
- sock: AsyncFD
738
739
povl: RefCustomOverlapped
739
740
740
741
var raddress = windowsAnyAddressFix (address)
@@ -745,7 +746,7 @@ elif defined(windows):
745
746
retFuture.fail (getTransportOsError (osLastError ()))
746
747
return retFuture
747
748
748
- if not (bindToDomain (sock, raddress.getDomain ())):
749
+ if not isDomainSet (sock) and not (bindToDomain (sock, raddress.getDomain ())):
749
750
let err = wsaGetLastError ()
750
751
sock.closeSocket ()
751
752
retFuture.fail (getTransportOsError (err))
@@ -791,6 +792,32 @@ elif defined(windows):
791
792
792
793
retFuture.cancelCallback = cancel
793
794
795
+ else : # address.family == AddressFamily.Unix:
796
+ retFuture.fail (newException (TransportAddressError , " Unsupported address family" ))
797
+
798
+ return retFuture
799
+
800
+ proc connect * (address: TransportAddress ,
801
+ bufferSize = DefaultStreamBufferSize ,
802
+ child: StreamTransport = nil ,
803
+ flags: set [TransportFlags ] = {}): Future [StreamTransport ] =
804
+ # # Open new connection to remote peer with address ``address`` and create
805
+ # # new transport object ``StreamTransport`` for established connection.
806
+ # # ``bufferSize`` is size of internal buffer for transport.
807
+ var retFuture = newFuture [StreamTransport ](" stream.transport.connect" )
808
+ if address.family in {AddressFamily .IPv4 , AddressFamily .IPv6 }:
809
+ var raddress = windowsAnyAddressFix (address)
810
+ try :
811
+ let sock = createAsyncSocket (raddress.getDomain (), SockType .SOCK_STREAM , Protocol .IPPROTO_TCP )
812
+ let r = connect (sock, address, bufferSize, child, flags)
813
+ proc cb (arg: pointer ) =
814
+ try :
815
+ retFuture.complete (r.read)
816
+ except CatchableError as exc:
817
+ retFuture.fail (exc)
818
+ r.addCallback (cb)
819
+ except CatchableError as exc:
820
+ retFuture.fail (exc)
794
821
elif address.family == AddressFamily .Unix :
795
822
# # Unix domain socket emulation with Windows Named Pipes.
796
823
var pipeHandle = INVALID_HANDLE_VALUE
@@ -807,45 +834,25 @@ elif defined(windows):
807
834
if pipeHandle == INVALID_HANDLE_VALUE :
808
835
let err = osLastError ()
809
836
if int32 (err) == ERROR_PIPE_BUSY :
810
- discard setTimer (Moment .fromNow (50 .milliseconds),
811
- pipeContinuation, nil )
837
+ discard setTimer (Moment .fromNow (50 .milliseconds), pipeContinuation, nil )
812
838
else :
813
839
retFuture.fail (getTransportOsError (err))
814
840
else :
815
- try :
816
- register (AsyncFD (pipeHandle))
817
- except CatchableError as exc:
818
- retFuture.fail (exc)
819
- return
820
-
821
- let transp = try : newStreamPipeTransport (AsyncFD (pipeHandle),
822
- bufferSize, child)
823
- except CatchableError as exc:
824
- retFuture.fail (exc)
825
- return
841
+ let transp =
842
+ try :
843
+ register (AsyncFD (pipeHandle))
844
+ newStreamPipeTransport (AsyncFD (pipeHandle), bufferSize, child)
845
+ except CatchableError as exc:
846
+ retFuture.fail (exc)
847
+ return
826
848
# Start tracking transport
827
849
trackStream (transp)
828
850
retFuture.complete (transp)
829
851
pipeContinuation (nil )
830
-
852
+ else :
853
+ retFuture.fail (newException (TransportAddressError , " Unsupported address family" ))
831
854
return retFuture
832
855
833
- proc connect * (address: TransportAddress ,
834
- bufferSize = DefaultStreamBufferSize ,
835
- child: StreamTransport = nil ,
836
- flags: set [TransportFlags ] = {}): Future [StreamTransport ] =
837
- # # Open new connection to remote peer with address ``address`` and create
838
- # # new transport object ``StreamTransport`` for established connection.
839
- # # ``bufferSize`` is size of internal buffer for transport.
840
- var raddress = windowsAnyAddressFix (address)
841
- let sock =
842
- try : createAsyncSocket (raddress.getDomain (), SockType .SOCK_STREAM , Protocol .IPPROTO_TCP )
843
- except CatchableError as exc:
844
- var retFuture = newFuture [StreamTransport ](" stream.transport.connect" )
845
- retFuture.fail (exc)
846
- return retFuture
847
- return connect (sock, raddress, bufferSize, child, flags)
848
-
849
856
proc createAcceptPipe (server: StreamServer ) {.
850
857
raises : [Defect , CatchableError ].} =
851
858
let pipeSuffix = $ cast [cstring ](addr server.local.address_un)
0 commit comments