设定 socket 非阻塞方式
代码:
u_long iNonBlock = 1;
ioctl( socket, FIONBIO, &iNonBlock );
err = connect( hs, (sockaddr *)&sa, sizeof(sa) ); if ( err == 0 ) { m_emSockState = SOCK_STATE_CONNECTED; } else { err = errno; if( err == EWOULDBLOCK || err == EINPROGRESS) { dbg_printf( 1, "connecting.... \n" ); m_emSockState = SOCK_STATE_CONNECTING; bConn = WaitConnected( 6000 ); } }
connect 在非阻塞方式下, errno 是
EINPROGRESS
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/un.h>
#include <netinet/in.h>
#include <linux/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <linux/tcp.h>
其中 FIONBIO 定义在 sys/ioctl ==> 最后会 ioctls.h (asm-generic )
设定 TCP_NODELAY 是在 linux/tcp.h
u_long nodelay = 1; err = setsockopt( hs, IPPROTO_TCP, TCP_NODELAY, (const char *)&nodelay, sizeof(nodelay) );