如何把该socket设置为阻塞模式

如何把该socket设置为阻塞模式,第1张

提供借鉴:阻塞SOCKET的非阻塞连接

//用非阻塞方式连接,这样的话,一旦连接不上,界面不会出现一段较长时间不响应。

int tcp_connect(char *ip, int port, struct timeval *timeout)

{

struct linger opt

struct sockaddr_in sin

struct linger lg

int sock

int nodelay

unsigned long ul

fd_set fdConnect

memset(&lg, 0, sizeof(struct linger))

sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)

if (sock == INVALID_SOCKET)

{

TRACE("socket errno:\t%d\n", WSAGetLastError())

return -1

}

ul = 1

if (ioctlsocket(sock, FIONBIO, &ul) == SOCKET_ERROR)

{

TRACE("ioctlsocket errno:\t%d\n", WSAGetLastError())

goto err_exit

}

memset(&sin, 0, sizeof(sin))

sin.sin_family = AF_INET

sin.sin_addr.S_un.S_addr = inet_addr(ip)

sin.sin_port = htons(port)

if (connect(sock, (struct sockaddr*)&sin, sizeof(sin)) == 0)

{

goto ONCE_SUC

}

FD_ZERO(&fdConnect)

FD_SET((unsigned int)sock, &fdConnect)

if (select(0, 0, &fdConnect, 0, timeout) <= 0)

{

TRACE("select errno:\t%d\n", WSAGetLastError())

goto err_exit

}

ONCE_SUC:

ul = 0

if (ioctlsocket(sock, FIONBIO, &ul) == SOCKET_ERROR)

{

TRACE("ioctlsocket errno:\t%d\n", WSAGetLastError())

goto err_exit

}

/*消除滞留*/

memset(&opt, 0, sizeof(struct linger))

if (setsockopt(sock, SOL_SOCKET, SO_LINGER, (char*)&opt, sizeof(opt)) == SOCKET_ERROR)

{

TRACE("SO_LINGER errno:\t%d\n", WSAGetLastError())

}

/*禁用合并*/

nodelay = 1

if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (char*) &nodelay, sizeof(int)) == SOCKET_ERROR)

{

TRACE("TCP_NODELAY errno:\t%d\n", WSAGetLastError())

}

return sock

err_exit:

closesocket(sock)

return -1

}

(1)好像默认就是阻塞模式

(2)用ioctlsocket()例如如果需要将cs设置为阻塞模式:

unsigned long ul=0

ioctlsocket(cs,FIONBIO,&ul)

(3)若要设置为非阻塞模式:

unsigned long ul=1//只要是非0值都可以

ioctlsocket(cs,FIONBIO,&ul)


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/10980647.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-12
下一篇 2023-05-12

发表评论

登录后才能评论

评论列表(0条)

保存