Code archives/Networking/Socket
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| Any problems with servent, protent, and hostent structure... They are all functions without winsock(only the WSAStartup und WSACleanup but i think, linux doesn't need this kind of function) With the SOCK_RAW you can manipulate the TCP/IP Header(just4hacking :)) to send pings and so on... Here a little example code: Import "socket.bmx"
Local tWSA:TWSAData
Local iSocket:Int
Local tAddress:TSockAddr
Print "Start Winsock..."
tWSA = New TWSAData
If s_WSAStartup(MAKESHORT(2, 0), tWSA) Then
Print "Error: "+s_WSAGetlastError()
' WSASYSNOTREADY
' (WSAVERNOTSUPPORTED)
' WSAEINVAL
Print "Closing Winsock..."
If s_WSACleanup() = SOCKET_ERROR Then
Print "Error: "+s_WSAGetlastError()
Else
Print "OK"
End If
End
Else
Print "OK"
End If
Print "Creating Socket..."
iSocket = s_socket(AF_INET, SOCK_STREAM, 0)
If iSocket = INVALID_SOCKET Then
Print "Error: "+s_WSAGetlastError()
' WSANOTINITIALISED
' WSAENETDOWN
' WSAEAFNOSUPPORT
' WSAEINPROGRESS
' WSAEMFILE
' WSAENOBUFS
' WSAEPROTONOSUPPORT
' WSAEPROTOTYPE
' WSAESOCKTNOSUPPORT
End
Else
Print "OK"
End If
Print "Connecting to blitzbasic.com"
tAddress = New TSockAddr
tAddress.shSinFamily = AF_INET
tAddress.shSinPort = s_htons(80)
tAddress.iSinAddr = s_gethostbyname("blitzbasic.com")
If s_connect(iSocket, tAddress, 16) = SOCKET_ERROR Then
Print "Error: "+s_WSAGetlastError()
' WSANOTINITIALISED
' WSAENETDOWN
' WSAEADDRINUSE
' WSAEINTR
' WSAEINPROGRESS
' WSAEADDRNOTAVAIL
' WSAEAFNOSUPPORT
' WSAECONNREFUSED
' WSAEDESTADDREQ
' WSAEFAULT
' WSAEINVAL
' WSAEISCONN
' WSAEMFILE
' WSAENETUNREACH
' WSAENOBUFS
' WSAENOTSOCK
' WSAETIMEDOUT
' WSAEWOULDBLOCK
Print "Closing Socket..."
If s_closesocket(iSocket) = SOCKET_ERROR Then
Print "Error: "+s_WSAGetlastError()
Else
Print "OK"
End If
Print "Closing Winsock..."
If s_WSACleanup() = SOCKET_ERROR Then
Print "Fehler: "+s_WSAGetlastError()
Else
Print "OK"
End If
End
Else
Print "OK"
End If
Print "Closing Socket..."
If s_closesocket(iSocket) = SOCKET_ERROR Then
Print "Error: "+s_WSAGetlastError()
' WSANOTINITIALISED
' WSAENETDOWN
' WSAENOTSOCK
' WSAEINPROGRESS
' WSAEINTR
' WSAEWOULDBLOCK
End
Else
Print "OK"
End If
Print "Closing Winsock..."
If s_WSACleanup() = SOCKET_ERROR Then
Print "Error: "+s_WSAGetlastError()
' WSANOTINITIALISED
' WSAENETDOWN
' WSAEINPROGRESS
End
Else
Print "OK"
End If
Print "Ready"Edit: Update the s_WSAStartup function and TWSAData Type. | |||||
Strict
Type TSockAddr
Field shSinFamily:Short
Field shSinPort:Short
Field iSinAddr:Int
Field lSinZero:Long
End Type
' Winsock only!
Type TFD_Set
Field iFD_Count:Int
Field iFD_Array:Int[64]
End Type
Type TTimeval
Field iTV_Sec:Int ' Seconds
Field iTV_USec:Int ' Milliseconds
End Type
' Winsock only!
Type TWSAData
Field shVersion:Short
Field shHighVersion:Short
Field sDescription:String
Field sSystemStatus:String
Field shMaxSockets:Short
Field shMaxUdpDg:Short
Field pbVendorInfo:Byte Ptr
End Type
Const IOCPARM_MASK = $7F
Const IOC_VOID = $20000000
Const IOC_OUT = $40000000
Const IOC_IN = $80000000
Const IOC_INOUT = (IOC_IN | IOC_OUT)
Const IPPROTO_IP = 0
Const IPPROTO_ICMP = 1
Const IPPROTO_IGMP = 2
Const IPPROTO_GGP = 3
Const IPPROTO_TCP = 6
Const IPPROTO_PUP = 12
Const IPPROTO_UDP = 17
Const IPPROTO_IDP = 22
Const IPPROTO_ND = 77
Const IPPROTO_RAW = 255
Const IPPROTO_MAX = 256
Const IPPORT_ECHO = 7
Const IPPORT_DISCARD = 9
Const IPPORT_SYSTAT = 11
Const IPPORT_DAYTIME = 13
Const IPPORT_NETSTAT = 15
Const IPPORT_FTP = 21
Const IPPORT_TELNET = 23
Const IPPORT_SMTP = 25
Const IPPORT_TIMESERVER = 37
Const IPPORT_NAMESERVER = 42
Const IPPORT_WHOIS = 43
Const IPPORT_MTP = 57
Const IPPORT_TFTP = 69
Const IPPORT_RJE = 77
Const IPPORT_FINGER = 79
Const IPPORT_TTYLINK = 87
Const IPPORT_SUPDUP = 95
Const IPPORT_EXECSERVER = 512
Const IPPORT_LOGINSERVER = 513
Const IPPORT_CMDSERVER = 514
Const IPPORT_EFSSERVER = 520
Const IPPORT_BIFFUDP = 512
Const IPPORT_WHOSERVER = 513
Const IPPORT_ROUTESERVER = 520
Const IPPORT_RESERVED = 1024
Const IMPLINK_IP = 155
Const IMPLINK_LOWEXPER = 156
Const IMPLINK_HIGHEXPER = 158
Const WSADESCRIPTION_LEN = 256
Const WSASYS_STATUS_LEN = 128
Const INADDR_ANY = 0
Const INADDR_LOOPBACK = $7F000001
Const INADDR_BROADCAST = $FFFFFFFF
Const INADDR_NONE = $FFFFFFFF
Const IP_OPTIONS = 1
Const SO_DEBUG = 1
Const SO_ACCEPTCONN = 2
Const SO_REUSEADDR = 4
Const SO_KEEPALIVE = 8
Const SO_DONTROUTE = 16
Const SO_BROADCAST = 32
Const SO_USELOOPBACK = 64
Const SO_LINGER = 128
Const SO_OOBINLINE = 256
Const SO_DONTLINGER = ~SO_LINGER
Const SO_SNDBUF = $1001
Const SO_RCVBUF = $1002
Const SO_SNDLOWAT = $1003
Const SO_RCVLOWAT = $1004
Const SO_SNDTIMEO = $1005
Const SO_RCVTIMEO = $1006
Const SO_ERROR = $1007
Const SO_TYPE = $1008
Const IP_MULTICAST_IF = 2
Const IP_MULTICAST_TTL = 3
Const IP_MULTICAST_LOOP = 4
Const IP_ADD_MEMBERSHIP = 5
Const IP_DROP_MEMBERSHIP = 6
Const IP_DEFAULT_MULTICAST_TTL = 1
Const IP_DEFAULT_MULTICAST_LOOP = 1
Const IP_MAX_MEMBERSHIPS = 20
Const INVALID_SOCKET = (-1)
Const SOCKET_ERROR = -1
Const SOCK_STREAM = 1
Const SOCK_DGRAM = 2
Const SOCK_RAW = 3
Const SOCK_RDM = 4
Const SOCK_SEQPACKET = 5
Const TCP_NODELAY = $0001
Const AF_UNSPEC = 0
Const AF_UNIX = 1
Const AF_INET = 2
Const AF_IMPLINK = 3
Const AF_PUP = 4
Const AF_CHAOS = 5
Const AF_IPX = 6
Const AF_NS = 6
Const AF_ISO = 7
Const AF_OSI = AF_ISO
Const AF_ECMA = 8
Const AF_DATAKIT = 9
Const AF_CCITT = 10
Const AF_SNA = 11
Const AF_DECnet = 12
Const AF_DLI = 13
Const AF_LAT = 14
Const AF_HYLINK = 15
Const AF_APPLETALK = 16
Const AF_NETBIOS = 17
Const AF_VOICEVIEW = 18
Const AF_FIREFOX = 19
Const AF_UNKNOWN1 = 20
Const AF_BAN = 21
Const AF_ATM = 22
Const AF_INET6 = 23
Const AF_MAX = 24
Const PF_UNSPEC = AF_UNSPEC
Const PF_UNIX = AF_UNIX
Const PF_INET = AF_INET
Const PF_IMPLINK = AF_IMPLINK
Const PF_PUP = AF_PUP
Const PF_CHAOS = AF_CHAOS
Const PF_NS = AF_NS
Const PF_IPX = AF_IPX
Const PF_ISO = AF_ISO
Const PF_OSI = AF_OSI
Const PF_ECMA = AF_ECMA
Const PF_DATAKIT = AF_DATAKIT
Const PF_CCITT = AF_CCITT
Const PF_SNA = AF_SNA
Const PF_DECnet = AF_DECnet
Const PF_DLI = AF_DLI
Const PF_LAT = AF_LAT
Const PF_HYLINK = AF_HYLINK
Const PF_APPLETALK = AF_APPLETALK
Const PF_VOICEVIEW = AF_VOICEVIEW
Const PF_FIREFOX = AF_FIREFOX
Const PF_UNKNOWN1 = AF_UNKNOWN1
Const PF_BAN = AF_BAN
Const PF_ATM = AF_ATM
Const PF_INET6 = AF_INET6
Const PF_MAX = AF_MAX
Const SOL_SOCKET = $FFFF
Const SOMAXCONN = 5
Const MSG_OOB = 1
Const MSG_PEEK = 2
Const MSG_DONTROUTE = 4
Const MSG_MAXIOVLEN = 16
Const MSG_PARTIAL = $8000
Const MAXGETHOSTSTRUCT = 1024
Const FD_READ = 1
Const FD_WRITE = 2
Const FD_OOB = 4
Const FD_ACCEPT = 8
Const FD_CONNECT = 16
Const FD_CLOSE = 32
' Winsock only!
Const WSABASEERR = 10000
Const WSAEINTR = (WSABASEERR+4)
Const WSAEBADF = (WSABASEERR+9)
Const WSAEACCES = (WSABASEERR+13)
Const WSAEFAULT = (WSABASEERR+14)
Const WSAEINVAL = (WSABASEERR+22)
Const WSAEMFILE = (WSABASEERR+24)
Const WSAEWOULDBLOCK = (WSABASEERR+35)
Const WSAEINPROGRESS = (WSABASEERR+36)
Const WSAEALREADY = (WSABASEERR+37)
Const WSAENOTSOCK = (WSABASEERR+38)
Const WSAEDESTADDRREQ = (WSABASEERR+39)
Const WSAEMSGSIZE = (WSABASEERR+40)
Const WSAEPROTOTYPE = (WSABASEERR+41)
Const WSAENOPROTOOPT = (WSABASEERR+42)
Const WSAEPROTONOSUPPORT = (WSABASEERR+43)
Const WSAESOCKTNOSUPPORT = (WSABASEERR+44)
Const WSAEOPNOTSUPP = (WSABASEERR+45)
Const WSAEPFNOSUPPORT = (WSABASEERR+46)
Const WSAEAFNOSUPPORT = (WSABASEERR+47)
Const WSAEADDRINUSE = (WSABASEERR+48)
Const WSAEADDRNOTAVAIL = (WSABASEERR+49)
Const WSAENETDOWN = (WSABASEERR+50)
Const WSAENETUNREACH = (WSABASEERR+51)
Const WSAENETRESET = (WSABASEERR+52)
Const WSAECONNABORTED = (WSABASEERR+53)
Const WSAECONNRESET = (WSABASEERR+54)
Const WSAENOBUFS = (WSABASEERR+55)
Const WSAEISCONN = (WSABASEERR+56)
Const WSAENOTCONN = (WSABASEERR+57)
Const WSAESHUTDOWN = (WSABASEERR+58)
Const WSAETOOMANYREFS = (WSABASEERR+59)
Const WSAETIMEDOUT = (WSABASEERR+60)
Const WSAECONNREFUSED = (WSABASEERR+61)
Const WSAELOOP = (WSABASEERR+62)
Const WSAENAMETOOLONG = (WSABASEERR+63)
Const WSAEHOSTDOWN = (WSABASEERR+64)
Const WSAEHOSTUNREACH = (WSABASEERR+65)
Const WSAENOTEMPTY = (WSABASEERR+66)
Const WSAEPROCLIM = (WSABASEERR+67)
Const WSAEUSERS = (WSABASEERR+68)
Const WSAEDQUOT = (WSABASEERR+69)
Const WSAESTALE = (WSABASEERR+70)
Const WSAEREMOTE = (WSABASEERR+71)
Const WSAEDISCON = (WSABASEERR+101)
Const WSASYSNOTREADY = (WSABASEERR+91)
Const WSAVERNOTSUPPORTED = (WSABASEERR+92)
Const WSANOTINITIALISED = (WSABASEERR+93)
Const WSAHOST_NOT_FOUND = (WSABASEERR+1001)
Const WSATRY_AGAIN = (WSABASEERR+1002)
Const WSANO_RECOVERY = (WSABASEERR+1003)
Const WSANO_DATA = (WSABASEERR+1004)
Extern "Os"
Function s_accept:Int(iSocket:Int, tAddr:Byte Ptr, ipAddrLen:Int Ptr) = "accept@12"
Function s_bind:Int(iSocket:Int, tName:Byte Ptr, iNameLen:Int) = "bind@12"
Function s_closesocket:Int(iSocket:Int) = "closesocket@4"
Function s_connect:Int(iSocket:Int, tName:Byte Ptr, iNameLen:Int) = "connect@12"
Function s_getpeername:Int(iSocket:Int, tName:Byte Ptr, ipNameLen:Int Ptr) = "getpeername@12"
Function s_getsockname:Int(iSocket:Int, tName:Byte Ptr, ipNameLen:Int Ptr) = "getsockname@12"
Function s_getsockopt:Int(iSocket:Int, iLevel:Int, iOptname:Int, pOptval:Byte Ptr, ipOptlen:Int Ptr) = "getsockopt@20"
Function s_htonl:Int(iHost:Int) = "htonl@4"
Function s_htons:Short(shHost:Short) = "htons@4"
Function w_inet_addr:Int(sDottedIP:Byte Ptr) = "inet_addr@4"
Function w_inet_ntoa:Byte Ptr(iAddr:Int) = "inet_ntoa@4"
Function s_ioctlsocket:Int(iSocket:Int, iCmd:Int, pArqp:Byte Ptr) = "ioctlsocket@12"
Function s_listen:Int(iSocket:Int, iBacklog:Int) = "listen@8"
Function s_ntohl:Int(iNet:Int) = "ntohl@4"
Function s_ntohs:Int(shNet:Short) = "ntohs@4"
Function s_recv:Int(iSocket:Int, pBuf:Byte Ptr, iLen:Int, iFlags:Int) = "recv@16"
Function s_recvfrom:Int(iSocket:Int, pBuf:Byte Ptr, iLen:Int, iFlags:Int, tFrom:Byte Ptr, ipFromLen:Int Ptr) = "recvfrom@24"
Function w_select:Int(iNFDS:Int, tReadFds:Byte Ptr, tWriteFds:Byte Ptr, tExceptFds:Byte Ptr, tTimeout:Byte Ptr) = "select@20"
Function s_send:Int(iSocket:Int, pBuf:Byte Ptr, iLen:Int, iFlags:Int) = "send@16"
Function s_sendto:Int(iSocket:Int, pBuf:Byte Ptr, iLen:Int, iFlags:Int, tTo:Byte Ptr, iToLen:Int) = "sendto@24"
Function s_setsockopt:Int(iSocket:Int, iLevel:Int, iOptname:Int, pOptval:Byte Ptr, iOptlen:Int) = "setsockopt@20"
Function s_shutdown:Int(iSocket:Int, iHow:Int) = "shutdown@8"
Function s_socket:Int(iDomain:Int, iType:Int, iProtocol:Int) = "socket@12"
Function w_gethostbyaddr:Byte Ptr(ipAddr:Byte Ptr, iLen:Int, iType:Int) = "gethostbyaddr@12"
Function w_gethostbyname:Byte Ptr(pName:Byte Ptr) = "gethostbyname@4"
Function w_gethostname:Int(pName:Byte Ptr, iNameLen:Int) = "gethostname@8"
Function w_getprotobynumber:Byte Ptr(iNumber:Int) = "getprotobynumber@4"
Function w_getprotobyname:Byte Ptr(pName:Byte Ptr) = "getprotobyname@4"
Function w_getservbyname:Byte Ptr(pName:Byte Ptr, pProto:Byte Ptr = Null) = "getservbyname@8"
Function w_getservbyport:Byte Ptr(iPort:Int, pProto:Byte Ptr) = "getservbyport@8"
' Winsock only!
Function w_WSAStartup:Int(shVersion:Short, tWSA:Byte Ptr) = "WSAStartup@8"
Function s_WSAGetLastError:Int() = "WSAGetLastError@0"
Function s_WSACleanup:Int() = "WSACleanup@0"
Function w_WSAFDIsSet:Int(iSocket:Int,pSet:Byte Ptr) = "__WSAFDIsSet@8"
Function MemCopy2(dest:byte Ptr, src:Int, size:INt) = "bbMemCopy"
End Extern
Function MAKESHORT:Short(bA:Byte, bB:Byte)
Return bA | (bB Shl 8)
End Function
Function MAKEINT:Int(shA:Short, shB:Short)
Return shA | (shB Shl 16)
End Function
' FD Structure - Winsock only!
Function s_FD_CLR(iSocket, tSet:TFD_SET)
Local bIndex:Byte, bFound
For bIndex = 1 To tSet.iFD_Count
If tSet.iFD_Array[bIndex-1] = iSocket Then
bFound = bIndex
Exit
EndIf
Next
For bIndex = bFound To tSet.iFD_Count-1
tSet.iFD_Array[bIndex-1] = tSet.iFD_Array[bIndex+1]
Next
tSet.iFD_Count = tSet.iFD_Count-1
End Function
Function s_FD_SET(iSocket, tSet:TFD_SET)
Local bIndex:Byte, bFound:Byte
For bIndex = 1 To tSet.iFD_Count
If tSet.iFD_Array[bIndex-1] = iSocket Then
bFound = bIndex
Exit
EndIf
Next
If bFound = 0 And tSet.iFD_Count < 65 Then
tSet.iFD_Array[tSet.iFD_Count] = iSocket
tSet.iFD_Count = tSet.iFD_Count+1
EndIf
End Function
Function s_FD_ZERO(tSet:TFD_SET)
tSet.iFD_Count = 0
End Function
Function s_FD_ISSET(iSocket:Int, tSet:TFD_SET)
Local bIndex:Byte, tTemp:TBank, iReturn:Int
tTemp = CreateBank(4+4*64)
PokeInt tTemp, 0, tSet.iFD_Count
For bIndex = 0 To 63
PokeInt tTemp, 4+bIndex*4, tSet.iFD_Array[bIndex]
Next
iReturn = w_WSAFDIsSet(iSocket, BankBuf(tTemp))
'Release tTemp
Return iReturn
End Function
Function s_inet_addr:Int(sDottedIP:String)
Return w_inet_addr(sDottedIP.ToCString())
End Function
Function s_inet_ntoa:String(iAddr:Int)
Return "".FromCString(w_inet_ntoa(iAddr))
End Function
Function s_select(iSocket:Int, tReadFDS:TFD_SET, tWriteFDS:TFD_SET, tExceptFDS:TFD_SET, tTimeout:TTimeval)
Local tTempRead:TBank, tTempWrite:TBank, tTempExcept:TBank, bIndex:Byte
Local pReadFDS:Byte Ptr
Local pWriteFDS:Byte Ptr
Local pExceptFDS:Byte Ptr
Local iReturn:Int
If tReadFDS Then
tTempRead = CreateBank(4+4*64)
pReadFDS = BankBuf(tTempRead)
PokeInt tTempRead, 0, tReadFDS.iFD_Count
For bIndex = 0 To 63
PokeInt tTempRead, 4+bIndex*4, tReadFDS.iFD_Array[bIndex]
Next
Else
pReadFDS = Null
End If
If tWriteFDS Then
tTempWrite = CreateBank(4+4*64)
pWriteFDS = BankBuf(tTempWrite)
PokeInt tTempWrite, 0, tWriteFDS.iFD_Count
For bIndex = 0 To 63
PokeInt tTempWrite, 4+bIndex*4, tWriteFDS.iFD_Array[bIndex]
Next
Else
pWriteFDS = Null
End If
If tExceptFDS Then
tTempExcept = CreateBank(4+4*64)
pExceptFDS = BankBuf(tTempExcept)
PokeInt tTempExcept, 0, tExceptFDS.iFD_Count
For bIndex = 0 To 63
PokeInt tTempExcept, 4+bIndex*4, tExceptFDS.iFD_Array[bIndex]
Next
Else
pExceptFDS = Null
End If
iReturn = w_select(iSocket, pReadFDS, pWriteFDS, pExceptFDS, tTimeout)
If tReadFDS Then
tReadFDS.iFD_Count = PeekInt(tTempRead, 0)
For bIndex = 0 To 63
tReadFDS.iFD_Array[bIndex] = PeekInt(tTempRead, 4+bIndex*4)
Next
' Release tTempRead
End If
If tWriteFDS Then
tWriteFDS.iFD_Count = PeekInt(tTempWrite, 0)
For bIndex = 0 To 63
tWriteFDS.iFD_Array[bIndex] = PeekInt(tTempWrite, 4+bIndex*4)
Next
' Release tTempWrite
End If
If tExceptFDS Then
tExceptFDS.iFD_Count = PeekInt(tTempExcept, 0)
For bIndex = 0 To 63
tExceptFDS.iFD_Array[bIndex] = PeekInt(tTempExcept, 4+bIndex*4)
Next
' Release tTempExcept
End If
Return iReturn
End Function
Function s_gethostbyaddr:String(iAddr:Int)
Local pHostent:Byte Ptr, tHostent:TBank, bName:Byte[255]
If iAddr = 0 Then Return ""
pHostent = w_gethostbyaddr(Varptr iAddr, 4, PF_INET)
If Not pHostent Then Return ""
tHostent = CreateBank(16)
MemCopy(BankBuf(tHostent), pHostent, 16)
MemCopy2(bName, PeekInt(tHostent, 0), 255)
'Release tHostent
Return "".FromCString(bName)
End Function
Function s_gethostbyname:Int(sURL:String)
Local iIP:Int, tpHostent:Byte Ptr, tHostent:TBank, ipIP:Int Ptr
If sURL = "" Then Return 0
iIP = s_inet_addr(sURL)
If iIP <> INADDR_NONE Then
Return iIP
Else
tpHostent = w_gethostbyname(sURL.ToCString())
If Not tpHostent Then Return 0
tHostent = CreateBank(16)
MemCopy(BankBuf(tHostent), tpHostent, 16) ' tHostent = *tpHostent
MemCopy2(Varptr ipIP, PeekInt(tHostent, 12), 4) ' iiIP = tHostent.piAddrList[]
'Release tHostent
Return Var ipIP
End If
End Function
Function s_gethostname:Int(sName:String Var)
Local tBuffer:TBank, iResult:Int
tBuffer = CreateBank(255)
iResult = w_gethostname(BankBuf(tBuffer), 255)
If iResult = SOCKET_ERROR Then
'Release tBuffer
Return SOCKET_ERROR
Else
sName = "".FromCString(BankBuf(tBuffer))
'Release tBuffer
Return iResult
EndIf
End Function
Function s_getprotobynumber:String(iNumber:Int)
Local pProtoent:Byte Ptr, tProtoent:TBank, bName:Byte[255]
pProtoent = w_getprotobynumber(iNumber)
If Not pProtoent Then Return ""
tProtoent = CreateBank(10)
MemCopy(BankBuf(tProtoent), pProtoent, 10)
MemCopy2(bName, PeekInt(tProtoent, 0), 255)
'Release tProtoent
Return "".FromCString(bName)
End Function
Function s_getprotobyname:Short(sName:String)
Local pProtoent:Byte Ptr, tProtoent:TBank, shPort:Short
pProtoent = w_getprotobyname(sName.ToCString())
If Not pProtoent Then Return 0
tProtoent = CreateBank(10)
MemCopy(BankBuf(tProtoent), pProtoent, 10)
shPort = PeekShort(tProtoent, 8)
'Release tProtoent
Return shPort
End Function
Function s_getservbyname:String(sName:String, sProto:String)
Local pServent:Byte Ptr, tServent:TBank, bName:Byte[255]
pServent = w_getservbyname(sName.ToCString(), sProto.ToCString())
If Not pServent Then Return ""
tServent = CreateBank(14)
MemCopy(BankBuf(tServent), pServent, 14)
MemCopy2(bName, PeekInt(tServent, 0), 255)
'Release tServent
Return "".FromCString(bName)
End Function
Function s_getservbyport:String(iPort:Int, sProto:String)
Local pServent:Byte Ptr, tServent:TBank, bName:Byte[255]
pServent = w_getservbyport(iPort, sProto.ToCString())
If Not pServent Then Return
tServent = CreateBank(14)
MemCopy(BankBuf(tServent), pServent, 14)
MemCopy2(bName, PeekInt(tServent, 0), 255)
'Release tServent
Return "".FromCString(bName)
End Function
Function s_WSAStartup(shVersion:Short, tWSA:TWSAData Var)
Local bTemp:TBank, iReturn:Int, bChar:Byte, shIndex:Short
Local sDescription:String, sSystemStatus:String
bTemp = CreateBank(400)
iReturn = w_WSAStartup(shVersion, BankBuf(bTemp))
If iReturn <> 0 Then
Return iReturn
Else
For shIndex = 4 To 260
bChar = PeekByte(bTemp, shIndex)
If bChar = 0 Then Exit
sDescription = sDescription+Chr(bChar)
Next
For shIndex = 261 To 359
bChar = PeekByte(bTemp, shIndex)
If bChar = 0 Then Exit
sSystemStatus = sSystemStatus+Chr(bChar)
Next
'MemCopy2(Varptr tWSA.pbVendorInfo , PeekInt(bTemp, 396), 4) ' no one need this :)
tWSA.shVersion = PeekShort(bTemp, 0)
tWSA.shHighVersion = PeekShort(bTemp, 2)
tWSA.sDescription = sDescription
tWSA.sSystemStatus = sSystemStatus
tWSA.shMaxSockets = PeekShort(bTemp, 390)
tWSA.shMaxUdpDg = PeekShort(bTemp, 392)
Return iReturn
EndIf
End Function |
Comments
| ||
| I have update the s_select Function for TFD_Set and addet FD_CLR, FD_SET, FD_ZERO and FD_ISSET. So you can do recv / recvfrom without blockingcall. TFD_Set is decklared for the Windows FD_SET Structure, a nother OS has another structure. bla bla bla... Here a UDP exmaple with blocking call but [bad stuff] happens: Server.bmx: Strict Import "Socket.bmx" Local tWSA : TWSAData Local iSocket : Int Local tAddr : TSockAddr Local tAddrRemote : TSockAddr Local iRemoteLen : Int Local tBuffer : TBank Local sMessage : String Local iResult : Int Print "UDP Server" Print "" tWSA = New TWSAData Print "Starting Winsock..." If s_WSAStartup(MAKESHORT(2, 0), tWSA) <> 0 Then Print " Error: "+s_WSAGetLastError() Else Print " OK ( "+tWSA.sDescription+" \ "+tWSA.sSystemStatus+" )" Print "" EndIf Print "Creating UDP-Socket..." iSocket = s_socket(AF_INET, SOCK_DGRAM, 0) If iSocket = INVALID_SOCKET Then Print " Error: "+s_WSAGetLastError() Else Print " OK" Print "" EndIf tAddr = New TSockAddr tAddr.shSinFamily = AF_INET tAddr.shSinPort = s_htons(1234) tAddr.iSinAddr = INADDR_ANY Print "Binding socket on port 1234..." iResult = s_bind(iSocket, tAddr, 16) If iResult = SOCKET_ERROR Then Print " Error: "+s_WSAGetLastError() Else Print " OK" Print "" EndIf tAddrRemote = New TSockAddr iRemoteLen = 16 tBuffer = CreateBank(256) While True Print "Waiting For incomming data..." iResult = s_recvfrom(iSocket, BankBuf(tBuffer), 256, 0, tAddrRemote, Varptr iRemoteLen) If iResult = SOCKET_ERROR Then Print " Error: "+s_WSAGetLastError() Print "" Else Print " OK ( "+iResult+" Bytes received )" Print " Sender:" Print " Port: "+s_ntohs(tAddrRemote.shSinPort) Print " IP: "+s_inet_ntoa(tAddrRemote.iSinAddr) Print " Message: "+"".FromCString(BankBuf(tBuffer)) Print "" EndIf Print " Sending message..." sMessage = "I have received: "+"".FromCString(BankBuf(tBuffer)) iResult = s_sendto(iSocket, sMessage.ToCString(), Len(sMessage)+1, 0, tAddrRemote, 16) If iResult = SOCKET_ERROR Then Print " Error: "+s_WSAGetLastError() Print "" Else Print " OK ( "+iResult+" Bytes sended )" Print "" EndIf Wend Print "Closing socket..." If s_closesocket(iSocket) = SOCKET_ERROR Then Print " Error: "+s_WSAGetLastError() Print "" Else Print " OK" Print "" EndIf Print "Closing Winsock..." If s_WSACleanup() = SOCKET_ERROR Then Print " Error: "+s_WSAGetLastError() Print "" Else Print " OK" Print "" EndIf Print "Good bye!" Delay 1000 End Client.bmx: Strict
Import "Socket.bmx"
Local tWSA : TWSAData
Local iSocket : Int
Local tAddr : TSockAddr
Local tAddrRemote : TSockAddr
Local iRemoteLen : Int
Local tBuffer : TBank
Local sMessage : String
Local iResult : Int
Print "UDP Client"
Print ""
tWSA = New TWSAData
Print "Starting Winsock..."
If s_WSAStartup(MAKESHORT(2, 0), tWSA) <> 0 Then
Print " Error: "+s_WSAGetLastError()
Else
Print " OK ( "+tWSA.sDescription+" \ "+tWSA.sSystemStatus+" )"
Print ""
EndIf
Print "Creating UDP-Socket..."
iSocket = s_socket(AF_INET, SOCK_DGRAM, 0)
If iSocket = INVALID_SOCKET Then
Print " Error: "+s_WSAGetLastError()
Else
Print " OK"
Print ""
EndIf
tAddr = New TSockAddr
tAddr.shSinFamily = AF_INET
tAddr.shSinPort = s_htons(1234)
tAddr.iSinAddr = s_inet_addr("127.0.0.1")
tAddrRemote = New TSockAddr
iRemoteLen = 16
tBuffer = CreateBank(256)
While True
sMessage = Input("Message: ")
If sMessage = "quit" Then Exit
Print " Sending message..."
iResult = s_sendto(iSocket, sMessage.ToCString(), Len(sMessage)+1, 0, tAddr, 16)
If iResult = SOCKET_ERROR Then
Print " Error: "+s_WSAGetLastError()
Print ""
Else
Print " OK ( "+iResult+" Bytes sended )"
Print ""
EndIf
Print "Waiting For incomming data..."
iResult = s_recvfrom(iSocket, BankBuf(tBuffer), 256, 0, tAddrRemote, Varptr iRemoteLen)
If iResult = SOCKET_ERROR Then
Print " Error: "+s_WSAGetLastError()
Print ""
Else
Print " OK ( "+iResult+" Bytes received )"
Print " Sender:"
Print " Port: "+s_ntohs(tAddrRemote.shSinPort)
Print " IP: "+s_inet_ntoa(tAddrRemote.iSinAddr)
Print " Message: "+"".FromCString(BankBuf(tBuffer))
Print ""
EndIf
Wend
Print "Closing socket..."
If s_closesocket(iSocket) = SOCKET_ERROR Then
Print " Error: "+s_WSAGetLastError()
Print ""
Else
Print " OK"
Print ""
EndIf
Print "Closing Winsock..."
If s_WSACleanup() = SOCKET_ERROR Then
Print " Error: "+s_WSAGetLastError()
Print ""
Else
Print " OK"
Print ""
EndIf
Print "Good bye!"
Delay 1000
EndUpdate for functions there use hostent, prtoent and servent structures will bei update soon. cu olli |
| ||
| I have programmed a tcp server (without blockingcall!!!!!!) and a client. Server: Strict Import "Socket.bmx" Local tWSA : TWSAData Local iServerSocket : Int Local tAddr : TSockAddr Local tAddrRemote : TSockAddr Local iRemoteLen : Int Local iResult : Int Local iClient : Int[10] Local iIndex : Int Local tFDSRead : TFD_SET Local tTimeout : TTimeval Local tBuffer : TBank Local sMessage : String Print "TCP Server" Print "" tWSA = New TWSAData Print "Starting Winsock..." If s_WSAStartup(MAKESHORT(2, 0), tWSA) <> 0 Then Print " Error: "+s_WSAGetLastError() Delay 2000 ; End Else Print " OK ( "+tWSA.sDescription+" \ "+tWSA.sSystemStatus+" )" Print "" EndIf Print "Creating TCP-Socket..." iServerSocket = s_socket(AF_INET, SOCK_STREAM, 0) If iServerSocket = INVALID_SOCKET Then Print " Error: "+s_WSAGetLastError() Delay 2000 ; End Else Print " OK" Print "" EndIf tAddr = New TSockAddr tAddr.shSinFamily = AF_INET tAddr.shSinPort = s_htons(1234) tAddr.iSinAddr = INADDR_ANY Print "Binding socket on port 1234..." iResult = s_bind(iServerSocket, tAddr, 16) If iResult = SOCKET_ERROR Then Print " Error: "+s_WSAGetLastError() Delay 2000 ; End Else Print " OK" Print EndIf Print "Set socket in listen mode..." iResult = s_listen(iServerSocket, 10) If iResult = SOCKET_ERROR Then Print " Error: "+s_WSAGetLastError() Delay 2000 ; End Else Print " OK" Print EndIf For iIndex = 0 To 9 iClient[iIndex] = INVALID_SOCKET Next tFDSRead = New TFD_SET tAddrRemote = New TSockAddr tTimeout = New TTimeval tTimeout.iTV_Sec = 1 tTimeout.iTV_USec = 0 tBuffer = CreateBank(256) While True s_FD_ZERO(tFDSRead) s_FD_SET(iServerSocket, tFDSRead) For iIndex = 0 To 9 If iClient[iIndex] <> INVALID_SOCKET Then s_FD_SET(iClient[iIndex], tFDSRead) EndIf Next iResult = s_select(0, tFDSRead, Null, Null, tTimeout) If iResult = SOCKET_ERROR Then Print "Error: "+s_WSAGetLastError() Print "" End If If s_FD_ISSET(iServerSocket, tFDSRead) Then For iIndex = 0 To 9 If iClient[iIndex] = INVALID_SOCKET Then iRemoteLen = 16 iClient[iIndex] = s_accept(iServerSocket, tAddrRemote, Varptr iRemoteLen) Print "New Client ( ID: "+iIndex+" ):" Print " Port: "+s_ntohs(tAddrRemote.shSinPort) Print " IP: "+s_inet_ntoa(tAddrRemote.iSinAddr) Print "" Exit EndIf Next EndIf For iIndex = 0 To 9 If iClient[iIndex] <> INVALID_SOCKET Then If s_FD_ISSET(iClient[iIndex], tFDSRead) Then iResult = s_recv(iClient[iIndex], BankBuf(tBuffer), 256, 0) If iResult = 0 Or iResult = SOCKET_ERROR Then s_closesocket(iClient[iIndex]) iClient[iIndex] = INVALID_SOCKET Print "Client ( ID:"+iIndex+" ) has disconnected" Print "" Else Print "Client ( ID:"+iIndex+" ):" Print " "+iResult+" Bytes received" Print " Message: "+"".FromCString(BankBuf(tBuffer)) Print "" Print "Sending message to Client ( ID:"+iIndex+" )..." sMessage = "I have received: "+"".FromCString(BankBuf(tBuffer)) iResult = s_send(iClient[iIndex], sMessage.ToCString(), Len(sMessage)+1, 0) If iResult = SOCKET_ERROR Then Print " Error: "+s_WSAGetLastError() Print "" Else Print " OK ( "+iResult+" Bytes sended )" Print "" EndIf EndIf EndIf EndIf Next Print "Drink a beer, or make other coole things!" Wend Print "Closing socket..." If s_closesocket(iServerSocket) = SOCKET_ERROR Then Print " Error: "+s_WSAGetLastError() Delay 2000 ; End Else Print " OK" Print "" EndIf Print "Closing Winsock..." If s_WSACleanup() = SOCKET_ERROR Then Print " Error: "+s_WSAGetLastError() Delay 2000 ; End Else Print " OK" Print "" EndIf Print "Good bye!" Delay 1000 End Client: Strict
Import "Socket.bmx"
Local tWSA : TWSAData
Local iSocket : Int
Local tAddr : TSockAddr
Local iResult : Int
Local tBuffer : TBank
Local sMessage : String
Print "TCP Client"
Print ""
tWSA = New TWSAData
Print "Starting Winsock..."
If s_WSAStartup(MAKESHORT(2, 0), tWSA) <> 0 Then
Print " Error: "+s_WSAGetLastError()
Delay 2000 ; End
Else
Print " OK ( "+tWSA.sDescription+" \ "+tWSA.sSystemStatus+" )"
Print ""
EndIf
Print "Creating TCP-Socket..."
iSocket = s_socket(AF_INET, SOCK_STREAM, 0)
If iSocket = INVALID_SOCKET Then
Print " Error: "+s_WSAGetLastError()
Delay 2000 ; End
Else
Print " OK"
Print ""
EndIf
tAddr = New TSockAddr
tAddr.shSinFamily = AF_INET
tAddr.shSinPort = s_htons(1234)
tAddr.iSinAddr = s_inet_addr("127.0.0.1")
Print "Connecting socket to 127.0.0.1 ..."
iResult = s_connect(iSocket, tAddr, 16)
If iResult = SOCKET_ERROR Then
Print " Error: "+s_WSAGetLastError()
Delay 2000 ; End
Else
Print " OK"
Print ""
EndIf
tBuffer = CreateBank(256)
While True
sMessage = Input("Message: ")
If sMessage = "quit" Then Exit
Print " Sending message..."
iResult = s_send(iSocket, sMessage.ToCString(), Len(sMessage)+1, 0)
If iResult = SOCKET_ERROR Then
Print " Error: "+s_WSAGetLastError()
Print ""
Else
Print " OK ( "+iResult+" Bytes sended )"
Print ""
EndIf
Print "Waiting For incomming data..."
iResult = s_recv(iSocket, BankBuf(tBuffer), 256, 0)
If iResult = SOCKET_ERROR Then
Print " Error: "+s_WSAGetLastError()
Print ""
Else
Print " OK ( "+iResult+" Bytes received )"
Print " Message: "+"".FromCString(BankBuf(tBuffer))
Print ""
EndIf
Wend
Print "Closing socket..."
If s_closesocket(iSocket) = SOCKET_ERROR Then
Print " Error: "+s_WSAGetLastError()
Delay 2000 ; End
Else
Print " OK"
Print ""
EndIf
Print "Closing Winsock..."
If s_WSACleanup() = SOCKET_ERROR Then
Print " Error: "+s_WSAGetLastError()
Delay 2000 ; End
Else
Print " OK"
Print ""
EndIf
Print "Good bye!"
Delay 1000
Endcu olli |
Code Archives Forum