Add Socket Library for Linux
This commit is contained in:
parent
155a57b135
commit
f4d039a12d
1 changed files with 136 additions and 0 deletions
136
NET/lhs_net_socket.pbi
Normal file
136
NET/lhs_net_socket.pbi
Normal file
|
@ -0,0 +1,136 @@
|
|||
;************************
|
||||
;* 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
|
Loading…
Reference in a new issue