102 lines
3.4 KiB
Text
102 lines
3.4 KiB
Text
|
;lsocket.pbi
|
||
|
;
|
||
|
; Socket Module
|
||
|
; Definition who are not available on linux...
|
||
|
; Simple PureBasic Spech commands.
|
||
|
;
|
||
|
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
|
||
|
|
||
|
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
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
EndModule
|