|
@@ -124,6 +124,7 @@ HL_PRIM hl_socket *hl_socket_new( bool udp ) {
|
|
}
|
|
}
|
|
|
|
|
|
HL_PRIM void hl_socket_close( hl_socket *s ) {
|
|
HL_PRIM void hl_socket_close( hl_socket *s ) {
|
|
|
|
+ if( !s ) return;
|
|
closesocket(s->sock);
|
|
closesocket(s->sock);
|
|
s->sock = INVALID_SOCKET;
|
|
s->sock = INVALID_SOCKET;
|
|
}
|
|
}
|
|
@@ -131,13 +132,18 @@ HL_PRIM void hl_socket_close( hl_socket *s ) {
|
|
HL_PRIM int hl_socket_send_char( hl_socket *s, int c ) {
|
|
HL_PRIM int hl_socket_send_char( hl_socket *s, int c ) {
|
|
char cc;
|
|
char cc;
|
|
cc = (char)(unsigned char)c;
|
|
cc = (char)(unsigned char)c;
|
|
|
|
+ if( !s )
|
|
|
|
+ return -2;
|
|
if( send(s->sock,&cc,1,MSG_NOSIGNAL) == SOCKET_ERROR )
|
|
if( send(s->sock,&cc,1,MSG_NOSIGNAL) == SOCKET_ERROR )
|
|
return block_error();
|
|
return block_error();
|
|
return 1;
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
|
|
HL_PRIM int hl_socket_send( hl_socket *s, vbyte *buf, int pos, int len ) {
|
|
HL_PRIM int hl_socket_send( hl_socket *s, vbyte *buf, int pos, int len ) {
|
|
- int r = send(s->sock, (char*)buf + pos, len, MSG_NOSIGNAL);
|
|
|
|
|
|
+ int r;
|
|
|
|
+ if( !s )
|
|
|
|
+ return -2;
|
|
|
|
+ r = send(s->sock, (char*)buf + pos, len, MSG_NOSIGNAL);
|
|
if( r == SOCKET_ERROR )
|
|
if( r == SOCKET_ERROR )
|
|
return block_error();
|
|
return block_error();
|
|
return len;
|
|
return len;
|
|
@@ -145,7 +151,10 @@ HL_PRIM int hl_socket_send( hl_socket *s, vbyte *buf, int pos, int len ) {
|
|
|
|
|
|
|
|
|
|
HL_PRIM int hl_socket_recv( hl_socket *s, vbyte *buf, int pos, int len ) {
|
|
HL_PRIM int hl_socket_recv( hl_socket *s, vbyte *buf, int pos, int len ) {
|
|
- int ret = recv(s->sock, (char*)buf + pos, len, MSG_NOSIGNAL);
|
|
|
|
|
|
+ int ret;
|
|
|
|
+ if( !s )
|
|
|
|
+ return -2;
|
|
|
|
+ ret = recv(s->sock, (char*)buf + pos, len, MSG_NOSIGNAL);
|
|
if( ret == SOCKET_ERROR )
|
|
if( ret == SOCKET_ERROR )
|
|
return block_error();
|
|
return block_error();
|
|
return ret;
|
|
return ret;
|
|
@@ -153,7 +162,9 @@ HL_PRIM int hl_socket_recv( hl_socket *s, vbyte *buf, int pos, int len ) {
|
|
|
|
|
|
HL_PRIM int hl_socket_recv_char( hl_socket *s ) {
|
|
HL_PRIM int hl_socket_recv_char( hl_socket *s ) {
|
|
char cc;
|
|
char cc;
|
|
- int ret = recv(s->sock,&cc,1,MSG_NOSIGNAL);
|
|
|
|
|
|
+ int ret;
|
|
|
|
+ if( !s ) return -2;
|
|
|
|
+ ret = recv(s->sock,&cc,1,MSG_NOSIGNAL);
|
|
if( ret == SOCKET_ERROR || ret == 0 )
|
|
if( ret == SOCKET_ERROR || ret == 0 )
|
|
return block_error();
|
|
return block_error();
|
|
return (unsigned char)cc;
|
|
return (unsigned char)cc;
|
|
@@ -213,6 +224,7 @@ HL_PRIM bool hl_socket_connect( hl_socket *s, int host, int port ) {
|
|
addr.sin_family = AF_INET;
|
|
addr.sin_family = AF_INET;
|
|
addr.sin_port = htons((unsigned short)port);
|
|
addr.sin_port = htons((unsigned short)port);
|
|
*(int*)&addr.sin_addr.s_addr = host;
|
|
*(int*)&addr.sin_addr.s_addr = host;
|
|
|
|
+ if( !s ) return false;
|
|
if( connect(s->sock,(struct sockaddr*)&addr,sizeof(addr)) != 0 ) {
|
|
if( connect(s->sock,(struct sockaddr*)&addr,sizeof(addr)) != 0 ) {
|
|
int err = block_error();
|
|
int err = block_error();
|
|
if( err == -1 ) return true; // in progress
|
|
if( err == -1 ) return true; // in progress
|
|
@@ -222,11 +234,13 @@ HL_PRIM bool hl_socket_connect( hl_socket *s, int host, int port ) {
|
|
}
|
|
}
|
|
|
|
|
|
HL_PRIM bool hl_socket_listen( hl_socket *s, int n ) {
|
|
HL_PRIM bool hl_socket_listen( hl_socket *s, int n ) {
|
|
|
|
+ if( !s ) return false;
|
|
return listen(s->sock,n) != SOCKET_ERROR;
|
|
return listen(s->sock,n) != SOCKET_ERROR;
|
|
}
|
|
}
|
|
|
|
|
|
HL_PRIM bool hl_socket_bind( hl_socket *s, int host, int port ) {
|
|
HL_PRIM bool hl_socket_bind( hl_socket *s, int host, int port ) {
|
|
struct sockaddr_in addr;
|
|
struct sockaddr_in addr;
|
|
|
|
+ if( !s ) return false;
|
|
memset(&addr,0,sizeof(addr));
|
|
memset(&addr,0,sizeof(addr));
|
|
addr.sin_family = AF_INET;
|
|
addr.sin_family = AF_INET;
|
|
addr.sin_port = htons((unsigned short)port);
|
|
addr.sin_port = htons((unsigned short)port);
|
|
@@ -243,6 +257,7 @@ HL_PRIM hl_socket *hl_socket_accept( hl_socket *s ) {
|
|
_sockaddr addrlen = sizeof(addr);
|
|
_sockaddr addrlen = sizeof(addr);
|
|
SOCKET nsock;
|
|
SOCKET nsock;
|
|
hl_socket *hs;
|
|
hl_socket *hs;
|
|
|
|
+ if( !s ) return NULL;
|
|
nsock = accept(s->sock,(struct sockaddr*)&addr,&addrlen);
|
|
nsock = accept(s->sock,(struct sockaddr*)&addr,&addrlen);
|
|
if( nsock == INVALID_SOCKET )
|
|
if( nsock == INVALID_SOCKET )
|
|
return NULL;
|
|
return NULL;
|
|
@@ -254,7 +269,7 @@ HL_PRIM hl_socket *hl_socket_accept( hl_socket *s ) {
|
|
HL_PRIM bool hl_socket_peer( hl_socket *s, int *host, int *port ) {
|
|
HL_PRIM bool hl_socket_peer( hl_socket *s, int *host, int *port ) {
|
|
struct sockaddr_in addr;
|
|
struct sockaddr_in addr;
|
|
_sockaddr addrlen = sizeof(addr);
|
|
_sockaddr addrlen = sizeof(addr);
|
|
- if( getpeername(s->sock,(struct sockaddr*)&addr,&addrlen) == SOCKET_ERROR )
|
|
|
|
|
|
+ if( !s || getpeername(s->sock,(struct sockaddr*)&addr,&addrlen) == SOCKET_ERROR )
|
|
return false;
|
|
return false;
|
|
*host = *(int*)&addr.sin_addr;
|
|
*host = *(int*)&addr.sin_addr;
|
|
*port = ntohs(addr.sin_port);
|
|
*port = ntohs(addr.sin_port);
|
|
@@ -264,7 +279,7 @@ HL_PRIM bool hl_socket_peer( hl_socket *s, int *host, int *port ) {
|
|
HL_PRIM bool hl_socket_host( hl_socket *s, int *host, int *port ) {
|
|
HL_PRIM bool hl_socket_host( hl_socket *s, int *host, int *port ) {
|
|
struct sockaddr_in addr;
|
|
struct sockaddr_in addr;
|
|
_sockaddr addrlen = sizeof(addr);
|
|
_sockaddr addrlen = sizeof(addr);
|
|
- if( getsockname(s->sock,(struct sockaddr*)&addr,&addrlen) == SOCKET_ERROR )
|
|
|
|
|
|
+ if( !s || getsockname(s->sock,(struct sockaddr*)&addr,&addrlen) == SOCKET_ERROR )
|
|
return false;
|
|
return false;
|
|
*host = *(int*)&addr.sin_addr;
|
|
*host = *(int*)&addr.sin_addr;
|
|
*port = ntohs(addr.sin_port);
|
|
*port = ntohs(addr.sin_port);
|
|
@@ -283,6 +298,7 @@ HL_PRIM bool hl_socket_set_timeout( hl_socket *s, double t ) {
|
|
struct timeval time;
|
|
struct timeval time;
|
|
init_timeval(t,&time);
|
|
init_timeval(t,&time);
|
|
#endif
|
|
#endif
|
|
|
|
+ if( !s ) return false;
|
|
if( setsockopt(s->sock,SOL_SOCKET,SO_SNDTIMEO,(char*)&time,sizeof(time)) != 0 )
|
|
if( setsockopt(s->sock,SOL_SOCKET,SO_SNDTIMEO,(char*)&time,sizeof(time)) != 0 )
|
|
return false;
|
|
return false;
|
|
if( setsockopt(s->sock,SOL_SOCKET,SO_RCVTIMEO,(char*)&time,sizeof(time)) != 0 )
|
|
if( setsockopt(s->sock,SOL_SOCKET,SO_RCVTIMEO,(char*)&time,sizeof(time)) != 0 )
|
|
@@ -291,6 +307,8 @@ HL_PRIM bool hl_socket_set_timeout( hl_socket *s, double t ) {
|
|
}
|
|
}
|
|
|
|
|
|
HL_PRIM bool hl_socket_shutdown( hl_socket *s, bool r, bool w ) {
|
|
HL_PRIM bool hl_socket_shutdown( hl_socket *s, bool r, bool w ) {
|
|
|
|
+ if( !s )
|
|
|
|
+ return false;
|
|
if( !r && !w )
|
|
if( !r && !w )
|
|
return true;
|
|
return true;
|
|
return shutdown(s->sock,r?(w?SHUT_RDWR:SHUT_RD):SHUT_WR) == 0;
|
|
return shutdown(s->sock,r?(w?SHUT_RDWR:SHUT_RD):SHUT_WR) == 0;
|
|
@@ -299,9 +317,12 @@ HL_PRIM bool hl_socket_shutdown( hl_socket *s, bool r, bool w ) {
|
|
HL_PRIM bool hl_socket_set_blocking( hl_socket *s, bool b ) {
|
|
HL_PRIM bool hl_socket_set_blocking( hl_socket *s, bool b ) {
|
|
#ifdef HL_WIN
|
|
#ifdef HL_WIN
|
|
unsigned long arg = b?0:1;
|
|
unsigned long arg = b?0:1;
|
|
|
|
+ if( !s ) return false;
|
|
return ioctlsocket(s->sock,FIONBIO,&arg) == 0;
|
|
return ioctlsocket(s->sock,FIONBIO,&arg) == 0;
|
|
#else
|
|
#else
|
|
- int rights = fcntl(s->sock,F_GETFL);
|
|
|
|
|
|
+ int rights;
|
|
|
|
+ if( !s ) return false;
|
|
|
|
+ rights = fcntl(s->sock,F_GETFL);
|
|
if( rights == -1 )
|
|
if( rights == -1 )
|
|
return false;
|
|
return false;
|
|
if( b )
|
|
if( b )
|
|
@@ -314,11 +335,13 @@ HL_PRIM bool hl_socket_set_blocking( hl_socket *s, bool b ) {
|
|
|
|
|
|
HL_PRIM bool hl_socket_set_fast_send( hl_socket *s, bool b ) {
|
|
HL_PRIM bool hl_socket_set_fast_send( hl_socket *s, bool b ) {
|
|
int fast = b;
|
|
int fast = b;
|
|
|
|
+ if( !s ) return false;
|
|
return setsockopt(s->sock,IPPROTO_TCP,TCP_NODELAY,(char*)&fast,sizeof(fast)) == 0;
|
|
return setsockopt(s->sock,IPPROTO_TCP,TCP_NODELAY,(char*)&fast,sizeof(fast)) == 0;
|
|
}
|
|
}
|
|
|
|
|
|
HL_PRIM int hl_socket_send_to( hl_socket *s, char *data, int len, int host, int port ) {
|
|
HL_PRIM int hl_socket_send_to( hl_socket *s, char *data, int len, int host, int port ) {
|
|
struct sockaddr_in addr;
|
|
struct sockaddr_in addr;
|
|
|
|
+ if( !s ) return -2;
|
|
memset(&addr,0,sizeof(addr));
|
|
memset(&addr,0,sizeof(addr));
|
|
addr.sin_family = AF_INET;
|
|
addr.sin_family = AF_INET;
|
|
addr.sin_port = htons((unsigned short)port);
|
|
addr.sin_port = htons((unsigned short)port);
|
|
@@ -332,6 +355,7 @@ HL_PRIM int hl_socket_send_to( hl_socket *s, char *data, int len, int host, int
|
|
HL_PRIM int hl_socket_recv_from( hl_socket *s, char *data, int len, int *host, int *port ) {
|
|
HL_PRIM int hl_socket_recv_from( hl_socket *s, char *data, int len, int *host, int *port ) {
|
|
struct sockaddr_in saddr;
|
|
struct sockaddr_in saddr;
|
|
int slen = sizeof(saddr);
|
|
int slen = sizeof(saddr);
|
|
|
|
+ if( !s ) return -2;
|
|
len = recvfrom(s->sock, data, len, MSG_NOSIGNAL, (struct sockaddr*)&saddr, &slen);
|
|
len = recvfrom(s->sock, data, len, MSG_NOSIGNAL, (struct sockaddr*)&saddr, &slen);
|
|
if( len == SOCKET_ERROR ) {
|
|
if( len == SOCKET_ERROR ) {
|
|
#ifdef HL_WIN
|
|
#ifdef HL_WIN
|