;************************ ;* Library : lhs_net_socket.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 ;*********************** ;* The SIGPIPE Signal must be Handled Inside / Ignored #SIGPIPE = 13 Procedure SignalIgnore() Debug("Signal Ignore") EndProcedure ;*********************** signal_(#SIGPIPE, @SignalIgnore()); DeclareModule lsocket Structure sockaddr sa_family.w sa_data.s{14} EndStructure Structure in_addr s_addr.l EndStructure Structure sockaddr_in sin_family.w sin_port.w sin_addr.in_addr sin_zero.a[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) Declare.s GetSocketIP(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.s GetSocketIP(Socket.i) Protected IPAddresse.s If lsockets_client(Str(Socket))\sin_family = 0 IPAddresse = PeekS(Inet_ntoa_(lsockets_client(Str(Socket))\sin_addr\s_addr), -1, #PB_Ascii) Else IPAddresse = PeekS(Inet_ntoa_(lsockets_client(Str(Socket))\sin_addr\s_addr), -1, #PB_Ascii) EndIf Debug "Requested IP Information:" + IPAddresse ProcedureReturn IPAddresse EndProcedure Procedure WaitSocket(ServerSocket.i) ;Return new ClientSocketID Protected ClientSID.i, MapID.s, ClientLength Protected memory memory = AllocateMemory(SizeOf(sockaddr_in)) ClientLength = SizeOf(sockaddr_in) ClientSID = accept_(ServerSocket, memory, @ClientLength) If ClientSID < 0 : FreeMemory(memory) : ProcedureReturn ClientSID : EndIf MapID = Str(ClientSID) CopyMemory(memory, lsockets_client(MapID), ClientLength) Debug "Connected IP:" + PeekS(Inet_ntoa_(lsockets_client(MapID)\sin_addr\s_addr), -1, #PB_Ascii) FreeMemory(memory) 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