diff options
Diffstat (limited to 'src/libjin/3rdparty/tekcos/tekcos.c')
-rw-r--r-- | src/libjin/3rdparty/tekcos/tekcos.c | 105 |
1 files changed, 56 insertions, 49 deletions
diff --git a/src/libjin/3rdparty/tekcos/tekcos.c b/src/libjin/3rdparty/tekcos/tekcos.c index 9705fe2..a1fc94e 100644 --- a/src/libjin/3rdparty/tekcos/tekcos.c +++ b/src/libjin/3rdparty/tekcos/tekcos.c @@ -13,18 +13,18 @@ enum { TK_SUCCESS = 0, - TK_INITFAILED, // init tekcos failed + TK_INITFAILED, // init tekcos failed - TK_COULDNETCREATESOCKET, // couldn't create socket. - TK_CONNECTFAILED, // connect to remote server failed. - TK_BINDSOCKETFAILED, // couldn't bind socket to port - TK_LISTENSOCKETFAILED, // couldn't listen to port - TK_INVALIDSOCKET, // invalid socket - TK_WRONGSOCKETTPYE, // wrong socket type + TK_COULDNETCREATESOCKET, // couldn't create socket. + TK_CONNECTFAILED, // connect to remote server failed. + TK_BINDSOCKETFAILED, // couldn't bind socket to port + TK_LISTENSOCKETFAILED, // couldn't listen to port + TK_INVALIDSOCKET, // invalid socket + TK_WRONGSOCKETTPYE, // wrong socket type - TK_INVALIDTARGET, // cant sendto. + TK_INVALIDTARGET, // cant sendto. - TK_UNKNOWN, // unknown + TK_UNKNOWN, // unknown }; // error code @@ -74,7 +74,6 @@ uint32 tk_strtohl(const char* str) { struct in_addr inaddr; inet_pton(AF_INET, str, (void*)&inaddr); - // host long return ntohl(inaddr.s_addr); } @@ -105,11 +104,16 @@ tk_TCPsocket* tk_tcp_open(tk_IPaddress ip) struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_port = htons(ip.port); - // 32bit address and 16bit port number. addr.sin_family = AF_INET; - if (ip.host != INADDR_NONE && (ip.host != INADDR_ANY)) - { // connet to an existed remote server. +//ws2def.h +//#define INADDR_ANY (ULONG)0x00000000 +//#define INADDR_LOOPBACK 0x7f000001 +//#define INADDR_BROADCAST (ULONG)0xffffffff +//#define INADDR_NONE 0xffffffff + + if (ip.host != INADDR_NONE && ip.host != INADDR_ANY) + { addr.sin_addr.s_addr = htonl(ip.host); if (connect(sk->id, (const struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) { @@ -117,8 +121,9 @@ tk_TCPsocket* tk_tcp_open(tk_IPaddress ip) goto error; } sk->type = SOCKET_TCLIENT; - }else - { // create a listenning server. + } + else + { addr.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(sk->id, (const struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) @@ -148,12 +153,12 @@ int tk_tcp_close(tk_TCPsocket* sk) { if (sk->id == INVALID_SOCKET) goto error; -#ifdef _WIN32 + #ifdef _WIN32 closesocket(sk->id); -#else - close(sk->id); -#endif - free(sk); + #else + close(sk->id); + #endif + free(sk); return 1; } error: @@ -161,23 +166,23 @@ error: return 0; } -int tk_tcp_send(tk_TCPsocket* client, const void* buffer, int bsize, int* sent) +int tk_tcp_send(tk_TCPsocket* client, const void* buffer, int size, int* sent) { - // byte poiter. const char *data = (const char*)buffer; if (client->type != SOCKET_TCLIENT) - {// only cliednt can send stuff. + { state = TK_WRONGSOCKETTPYE; goto error; } - //send(sk->id, buffer, bsize, 0); - int left = bsize; - if(sent) *sent = 0; + int left = size; + if(sent) + *sent = 0; int len = 0; do { len = send(client->id, data, left, 0); if (len > 0) { - if(sent) *sent += len; + if(sent) + *sent += len; left -= len; data += len; } @@ -187,24 +192,26 @@ error: return 0; } -int tk_tcp_recv(tk_TCPsocket* client, char* buffer, int bsize, int* len) +int tk_tcp_recv(tk_TCPsocket* client, char* buffer, int size, int* len) { *len = 0; if (client->type != SOCKET_TCLIENT) - {// only client can be recieved + { state = TK_WRONGSOCKETTPYE; goto error; } + int l = 0; do { - *len = recv(client->id, buffer, bsize, 0); - if (*len == SOCKET_ERROR) + l = recv(client->id, buffer, size - *len, 0); + if (l == SOCKET_ERROR) { state = TK_UNKNOWN; goto error; } - } while (*len == 0 || errno == EINTR); // if was suspended, recieve again. - buffer[*len] = '\0'; + *len += l; + buffer += l; + } while (l == 0 || errno == EINTR); return 1; error: return 0; @@ -212,9 +219,10 @@ error: tk_TCPsocket* tk_tcp_accept(tk_TCPsocket* server) { + // client socket tk_TCPsocket* csk = (tk_TCPsocket*) malloc(sizeof(tk_TCPsocket)); if (server->type != SOCKET_TSERVER) - {// only server can accept connection + { state = TK_WRONGSOCKETTPYE; goto error; } @@ -240,38 +248,38 @@ error: int tk_tcp_nonblocking(tk_TCPsocket* sk) { -#if defined(__BEOS__) && defined(SO_NONBLOCK) + #if defined(__BEOS__) && defined(SO_NONBLOCK) { long b = 1; setsockopt(sk->id, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b)); } -#elif defined(WIN32) + #elif defined(WIN32) { unsigned long mode = 1; ioctlsocket(sk->id, FIONBIO, &mode); } -#elif defined(__OS2__) + #elif defined(__OS2__) { int dontblock = 1; ioctl(sk->id, FIONBIO, &dontblock); } -#endif + #endif return 1; } int tk_tcp_blocking(tk_TCPsocket* sk) { -#if defined(__BEOS__) && defined(SO_NONBLOCK) + #if defined(__BEOS__) && defined(SO_NONBLOCK) { long b = 0; setsockopt(sk->id, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b)); } -#elif defined(WIN32) + #elif defined(WIN32) { unsigned long mode = 0; ioctlsocket(sk->id, FIONBIO, &mode); } -#elif defined(__OS2__) + #elif defined(__OS2__) { int dontblock = 0; ioctl(sk->id, FIONBIO, &dontblock); @@ -307,11 +315,11 @@ tk_UDPsocket* tk_udp_open(uint16 portnumber) goto error; } if (portnumber <= 0) - {// client, just return + { return sk; } else - {// server, need to bind address to socket + { struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_addr.s_addr = htonl(INADDR_ANY); @@ -357,7 +365,6 @@ int tk_udp_recvfrom(tk_UDPsocket* sk, tk_UDPpack* pack) return 0; } pack->len = n; - pack->data[n] = '\0'; return 1; } @@ -367,11 +374,11 @@ int tk_udp_close(tk_UDPsocket* sk) { if (sk->id != INVALID_SOCKET) { -#ifdef _WIN32 + #ifdef _WIN32 closesocket(sk->id); -#else - close(sk->id); -#endif + #else + close(sk->id); + #endif } free(sk); } @@ -383,4 +390,4 @@ int tk_freepack(tk_UDPpack* pack) free(pack->data); free(pack); return 1; -} +}
\ No newline at end of file |