Guest
Mar 14, 2010, 7:36 am UTCHome arrow Powerbasic arrow ConnectSocket
header image
ConnectSocket
Written by Dreamless Dancer   
Nov 01, 2009 at 01:11 PM
' 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 FUNCTION
GeSHi parsed in 0.339907169342 seconds.
Last Updated ( Nov 02, 2009 at 07:04 AM )
header image