' create a connection socket
' notes:
' don't use "retIpPort As String", instead we pump a message about the resulting connection to the buffer
' ByVal Async As Boolean: we are always creating non-async sockets
FUNCTION ConnectSocket(BYVAL HostName AS STRING, BYVAL UsePort AS LONG, _
BYVAL connectProc AS LONG) AS LONG
LOCAL socketCheck, Dummy AS DWORD
LOCAL sockin AS sockaddr_in
LOCAL dwHost AS hostentStru PTR
LOCAL connectHost AS ASCIIZ * 256
LOCAL ptrIpIndex AS DWORD PTR
LOCAL Work AS STRING
LOCAL sLinger AS linger
LOCAL SelectOps AS LONG
sockin.sin_family = %AF_INET
sockin.sin_port = htons(UsePort)
connectHost = HostName
' test for IP connect
Dummy = inet_addr(connectHost)
IF Dummy = %INADDR_NONE THEN
' not an IP address, so we resolve the host and get the IP
dwHost = GetHostByName(connectHost)
IF dwHost = %NULL THEN
' failed to get the IP address
PumpInternalMessage "++ Socket Error, failed to resolve "& HostName
ConnectSocket = %INVALID_SOCKET
EXIT FUNCTION
ELSE
ptrIpIndex = @dwHost.h_list
sockin.sin_addr.s_addr = @@ptrIpIndex
Work = @dwHost.@h_name &" = "& USING$("#_.#_.#_.#", _
sockin.sin_addr.S_un_b.s_b1, sockin.sin_addr.S_un_b.s_b2, _
sockin.sin_addr.S_un_b.s_b3, sockin.sin_addr.S_un_b.s_b4)
PumpInternalMessage Work
END IF
ELSE
sockin.sin_addr.s_addr = Dummy
END IF
' we resolved the IP address, have the port set, and the socket family set
' create the socket
socketCheck = socket(%PF_INET, %SOCK_STREAM, %IPPROTO_TCP)
IF socketCheck = %INVALID_SOCKET THEN
PumpInternalMessage "++ Connect Create Error: " _
& GetWSAErrorString(WSAGetLastError())
ConnectSocket = %INVALID_SOCKET
EXIT FUNCTION
END IF
' socket created, set the linger
sLinger.l_onoff = 1
sLinger.l_linger = 0
IF setsockopt(socketCheck, %SOL_SOCKET, %SO_LINGER, sLinger, 4) THEN
PumpInternalMessage "++ Error setting linger info: " _
& GetWSAErrorString(WSAGetLastError())
Dummy = closesocket(socketCheck)
ConnectSocket = %INVALID_SOCKET
EXIT FUNCTION
ELSE
IF getsockopt(socketCheck, %SOL_SOCKET, %SO_LINGER, sLinger, 4) THEN
PumpInternalMessage "++ Error getting linger info: " _
& GetWSAErrorString(WSAGetLastError())
Dummy = closesocket(socketCheck)
ConnectSocket = %INVALID_SOCKET
EXIT FUNCTION
END IF
END IF
' we should now be able to connect
IF cconnect(socketCheck, sockin, LEN(sockin)) THEN
PumpInternalMessage "++ Connect Error: " _
& GetWSAErrorString(WSAGetLastError())
IF socketCheck <> 0 THEN Dummy = closesocket(socketCheck)
ConnectSocket = %INVALID_SOCKET
EXIT FUNCTION
END IF
' set up the connection parameters
SelectOps = %FD_READ OR %FD_WRITE OR %FD_CONNECT OR %FD_CLOSE
IF WSAAsyncSelect(socketCheck, connectProc, %UM_WINSOCK, SelectOps) THEN
PumpInternalMessage "++ Connect Async Error: " _
& GetWSAErrorString(WSAGetLastError())
IF socketCheck <> 0 THEN Dummy = closesocket(socketCheck)
ConnectSocket = %INVALID_SOCKET
EXIT FUNCTION
END IF
ConnectSocket = socketCheck
END FUNCTIONGeSHi parsed in 0.207943201065 seconds.
|