lweb/lsocket.pbi

113 lines
3.7 KiB
Plaintext

;************************
;* 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