From aecb6c466c1e7efa0f07809aa18096e7d5559850 Mon Sep 17 00:00:00 2001 From: oroborus Date: Tue, 5 Aug 2008 15:56:30 +0000 Subject: - server/client poziva neblokujuci rezim TCP socketov git-svn-id: http://opensvn.csie.org/tuxanci_ng@190 0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e --- src/net/tcp.c | 28 ++++++++++++++++++++++++++++ src/net/tcp.h | 1 + 2 files changed, 29 insertions(+) (limited to 'src/net') diff --git a/src/net/tcp.c b/src/net/tcp.c index 1c3f6c0..f6c3dad 100755 --- a/src/net/tcp.c +++ b/src/net/tcp.c @@ -18,6 +18,7 @@ #include #include #include +#include #include "tcp.h" @@ -274,6 +275,33 @@ int disableNagle(sock_tcp_t *p) return result; } +int setTcpSockNonBlock(sock_tcp_t *p) +{ + /* Set to nonblocking socket mode */ +#ifndef __WIN32__ + int oldFlag; + + oldFlag = fcntl (p->sock, F_GETFL, 0); + + if( fcntl(p->sock, F_SETFL, oldFlag | O_NONBLOCK) == -1 ) + { + //printf("error setTcpSockNonBlock\n"); + return -1; + } + + //printf("setTcpSockNonBlock OK\n"); +#else + unsigned long arg = 1; + // Operation is FIONBIO. Parameter is pointer on non-zero number. + if( ioctlsocket(p->sock, FIONBIO, &arg) == SOCKET_ERROR ) + { + WSACleanup(); + return -1; + } +#endif + return 0; +} + int readTcpSocket(sock_tcp_t *p, void *address, int len) { assert( p != NULL ); diff --git a/src/net/tcp.h b/src/net/tcp.h index b7ea55b..ae870b3 100644 --- a/src/net/tcp.h +++ b/src/net/tcp.h @@ -29,6 +29,7 @@ extern void getSockTcpIp(sock_tcp_t *p, char *str_ip, int len); extern int getSockTcpPort(sock_tcp_t *p); extern sock_tcp_t* connectTcpSocket(char *ip, int port, int proto); extern int disableNagle(sock_tcp_t *p); +extern int setTcpSockNonBlock(sock_tcp_t *p); extern int readTcpSocket(sock_tcp_t *p, void *address, int len); extern int writeTcpSocket(sock_tcp_t *p, void *address, int len); extern void closeTcpSocket(sock_tcp_t *p); -- cgit v1.2.3