24 CONSTRUCTOR n2bConnection(
BYVAL Socket
AS LONG,
BYVAL Ep
AS ZSTRING PTR PTR)
28 IF setsockopt(Sock, IPPROTO_TCP, TCP_NODELAY,
CAST(
ANY PTR, @tmp),
SIZEOF(tmp)) = SOCKET_ERROR _
29 THEN *Errr = @
"setsockopt"
40 IF Sock = SOCKET_ERROR
THEN EXIT DESTRUCTOR
61 FUNCTION n2bConnection.nPut(
BYVAL Dat
AS STRING,
BYVAL ReTry
AS USHORT = 100)
AS INTEGER
62 RETURN nPut(
SADD(Dat),
LEN(Dat), ReTry)
83 FUNCTION n2bConnection.nPut(
BYVAL Dat
AS ANY PTR,
BYVAL Az
AS INTEGER,
BYVAL ReTry
AS USHORT = 100)
AS INTEGER
84 IF Sock = SOCKET_ERROR
THEN *Errr = @
"put socket check" :
RETURN -1
85 IF Dat = 0
ORELSE Az < 1
THEN *Errr = @
"put data check" :
RETURN -1
87 DIM AS INTEGER try = ReTry
90 IF select_(Sock + 1, 0, @FdsW, 0, @Timeout) = SOCKET_ERROR _
91 THEN *Errr = @
"select" :
RETURN -1
92 try -= 1 :
IF try < -1
THEN *Errr = @
"retry" :
RETURN -1
94 LOOP UNTIL FD_ISSET(Sock, @FdsW)
97 VAR n = send(Sock, Dat, x, 0)
98 IF n = SOCKET_ERROR
THEN *Errr = @
"send data" :
RETURN -1
101 LOOP UNTIL x <= 0 :
RETURN Az - x
124 FUNCTION n2bConnection.nGet(
BYREF Res
AS STRING,
BYVAL ReTry
AS USHORT = 100)
AS CONST ZSTRING CONST PTR
125 IF Sock = SOCKET_ERROR
THEN *Errr = @
"get socket check" :
RETURN *Errr
127 DIM AS STRING*size buf
130 DIM AS INTEGER try = ReTry
133 IF select_(Sock + 1, @FdsR, 0, 0, @Timeout) = SOCKET_ERROR _
134 THEN *Errr = @
"select" :
RETURN *Errr
135 try -= 1 :
IF try < -1
THEN *Errr = @
"retry" :
RETURN *Errr
137 LOOP UNTIL FD_ISSET(Sock, @FdsR)
138 VAR n = recv(Sock,
CAST(
UBYTE PTR, @buf), size, 0)
140 CASE SOCKET_ERROR : *Errr = @
"receive data" :
RETURN *Errr
141 CASE 0 :
IF 0 =
LEN(Res)
THEN *Errr = @
"disconnected" :
RETURN *Errr
143 CASE ELSE : Res &=
LEFT(buf, n)
157 Sock = opensocket(AF_INET, SOCK_STREAM, 0)
158 IF Sock = SOCKET_ERROR
THEN Errr = @
"opensocket"
170 FOR i
AS INTEGER = 0
TO UBOUND(Slots)
173 IF Sock <> SOCKET_ERROR
THEN closesocket(Sock)
190 VAR r =
NEW n2bConnection(Socket, @Errr) _
191 , u =
UBOUND(Slots) + 1
192 IF r
THEN REDIM PRESERVE Slots(u) : Slots(u) = r
208 FUNCTION n2bFactory.nClose(
BYVAL Con
AS n2bConnection
PTR)
AS CONST ZSTRING CONST PTR
209 VAR u =
UBOUND(Slots)
210 FOR i
AS INTEGER = 0
TO u
211 IF Slots(i) <> Con
THEN CONTINUE FOR
214 IF u > 0
THEN REDIM PRESERVE Slots(u - 1) :
RETURN 0
215 REDIM PRESERVE Slots(-1
TO -1) :
RETURN 0
216 NEXT : Errr = @
"find connection" :
RETURN Errr
229 CONSTRUCTOR nettobacClient(
BYREF Uri
AS STRING,
BYVAL Port
AS USHORT = 80)
231 IF Sock = SOCKET_ERROR
THEN EXIT CONSTRUCTOR
232 VAR he = gethostbyname(
SADD(Uri))
233 IF he = 0
THEN Errr = @
"client resolve IP" :
EXIT CONSTRUCTOR
235 DIM AS sockaddr_in sadr
236 sadr.sin_family = AF_INET
237 sadr.sin_port = htons(Port)
238 sadr.sin_addr = *
CPTR(in_addr
PTR, he->h_addr_list[0])
240 IF connect(Sock,
CPTR(sockaddr
PTR, @sadr),
SIZEOF(sockaddr)) < 0 _
241 THEN Errr = @
"client connect"
257 IF Sock = SOCKET_ERROR
THEN Errr = @
"client socket check" :
RETURN 0
271 CONSTRUCTOR nettobacServer(
BYVAL Port
AS USHORT = 80,
BYVAL Max
AS INTEGER = 64)
272 BASE() :
IF Sock = SOCKET_ERROR
THEN EXIT CONSTRUCTOR
275 IF SOCKET_ERROR = setsockopt(Sock, SOL_SOCKET, SO_REUSEADDR, @yes,
SIZEOF(
LONG)) _
276 THEN Errr = @
"setsockopt"
278 DIM AS sockaddr_in sadr
279 sadr.sin_family = AF_INET
280 sadr.sin_port = htons(port)
281 sadr.sin_addr.s_addr = INADDR_ANY
282 IF bind(Sock,
CPTR(sockaddr
PTR, @sadr),
SIZEOF(sockaddr)) = SOCKET_ERROR
THEN
283 Errr = @
"server bind"
284 ELSEIF listen(Sock, Max) = SOCKET_ERROR
THEN
285 Errr = @
"server listen"
309 FD_SET_(Sock, @readfd)
310 IF select_(Sock + 1, @readfd, 0, 0, @Timeout) = SOCKET_ERROR _
311 THEN Errr = @
"server select" :
RETURN 0
312 IF 0 = FD_ISSET(Sock, @readfd)
THEN Errr = @
"server isset" :
RETURN 0
313 VAR clientsock = accept(Sock, 0, 0)
314 IF clientsock = SOCKET_ERROR
THEN Errr = @
"server accept" :
RETURN 0
315 RETURN slot(clientsock)