;************************ ;* Library : lsocket.pbi ;* ;* Socket based Networkcommuncation Module. ;* ;* Created and develobed by Linder Hard- und Software ;* ;* Current only usable for Linux. ;* ;* CompilerIf #PB_Compiler_OS <> #PB_OS_Linux CompilerError "Only for Linux" CompilerEndIf DeclareModule lsocket Structure sockaddr sa_family.w sa_data.s{14} EndStructure Structure in_addr s_addr.w EndStructure Structure sockaddr_in sin_family.w sin_port.w sin_addr.in_addr sin_zero.s{8} EndStructure ; Socket types: #SOCK_STREAM = 1 ; stream (connection) socket #SOCK_DGRAM = 2 ; datagram (conn.less) socket #SOCK_RAW = 3 ; raw socket #SOCK_RDM = 4 ; reliably-delivered message #SOCK_SEQPACKET = 5 ; sequential packet socket #SOCK_PACKET = 10 ; linux specific way of ; getting packets at the dev ; level. For writing rarp And ; other similar things on the ; user level. ; socket.h #PF_INET = 2 #AF_INET = #PF_INET Declare CreateSocket(Port.i, Queuelengt.i = 64, Type.i = #SOCK_STREAM, Protocol.i = #AF_INET, BindedIP.s = "127.0.0.1") ; Return Server Socket < 0 Error Declare WaitSocket(ServerSocket.i) ;Return new SocketID Declare ReadSocket(ClientSocket.i, *Buffer, Length.i) ;Return Effective Read Declare WriteSocket(ClientSocket.i, *Buffer, Length.i) ;Return Effective Writen Declare CloseSocket(Socket.i) EndDeclareModule Module lsocket Global NewMap lsockets_server.sockaddr_in() Global NewMap lsockets_client.sockaddr_in() Procedure CreateSocket(Port.i, Queuelengt.i = 64, Type.i = #SOCK_STREAM, Protocol.i = #AF_INET, BindedIP.s = "127.0.0.1") ; Return Server Socket < 0 Error Protected SocketID.i SocketID = socket_(Protocol, Type, 0) If SocketID = -1 : ProcedureReturn -1 : EndIf lsockets_server(Str(SocketID))\sin_family = Protocol lsockets_server(Str(SocketID))\sin_addr\s_addr = Inet_addr_(BindedIP) lsockets_server(Str(SocketID))\sin_port = htons_(Port) If bind_(SocketID, @lsockets_server(Str(SocketID)), SizeOf(sockaddr_in)) <> 0 Close_(SocketID) DeleteMapElement(lsockets_server(), Str(SocketID)) ProcedureReturn -1 Else If listen_(SocketID, Queuelengt) <> 0 Close_(SocketID) DeleteMapElement(lsockets_server(), Str(SocketID)) ProcedureReturn -1 EndIf EndIf ProcedureReturn SocketID EndProcedure Procedure WaitSocket(ServerSocket.i) ;Return new ClientSocketID Protected ClientSID.i, MapID.s, ClientLength Protected Client.sockaddr_in ClientSID = accept_(ServerSocket, @Client, @ClientLength) If ClientSID < 0 : ProcedureReturn ClientSID : EndIf MapID = Str(ClientSID) lsockets_client(MapID)\sin_addr\s_addr = Client\sin_addr\s_addr lsockets_client(MapID)\sin_family = Client\sin_family lsockets_client(MapID)\sin_port = Client\sin_port lsockets_client(MapID)\sin_zero = Client\sin_zero ProcedureReturn ClientSID EndProcedure Procedure ReadSocket(ClientSocket.i, Buffer, Length.i) ;Return Effective Read Protected Effective.i Effective = read_(ClientSocket, Buffer, Length) ProcedureReturn Effective EndProcedure Procedure WriteSocket(ClientSocket.i, Buffer, Length.i) ;Return Effective Writen Protected Effective.i Effective = write_(ClientSocket, Buffer, Length) ProcedureReturn Effective EndProcedure Procedure CloseSocket(Socket.i) Protected Feedback.i Feedback = close_(Socket) ProcedureReturn Feedback EndProcedure EndModule