accept在非阻塞模式下如何判断是否有连接?

时间:2021-12-14 05:21:26

将程序设置为非阻塞模式,服务端调用accept函数之后不会导致程序暂停(这个是对的)
但是每次调用后无法判断accept函数是否捕获到了一个连接请求

在百度百科中说有这样二个错误:
WSAEMFILE:调用accept()时队列为空,无可用的描述字。
WSAENOTSOCK:描述字不是一个套接口。
于是我就这样写了

abc=accept(taolian,(SOCKADDR*)&duihua,&len);
if(WSAGetLastError()==WSAEMFILE || WSAGetLastError()==WSAENOTSOCK)
{
MessageBox("","",MB_OK);//弹出这个说明这次没有获取到连接请求
}

但是无论是否有连接,if语句块都不为真,因此无法判断"abc"是否可以recv和send了

我想问下:如何在非阻塞accept函数调用之后判断新的SOCKET连接是否有效?

7 个解决方案

#1


尽量避免使用select模型

#2


http://blog.csdn.net/yjgx007/archive/2005/01/03/237955.aspx

友情up~~~~

#3


在阻塞模式下,调用accept会阻塞,直到有连接进来或者有错误发生。   
 你的情况应该是使用了非阻塞模式,在这种情况下,accept会立刻返回,而不管是否有连接,因此在非阻塞模式时,
最好采用select,然后等待连接事件,当有连接时,再使用accept。

#4


引用 3 楼 zmlovelx 的回复:
在阻塞模式下,调用accept会阻塞,直到有连接进来或者有错误发生。  
你的情况应该是使用了非阻塞模式,在这种情况下,accept会立刻返回,而不管是否有连接,因此在非阻塞模式时, 
最好采用select,然后等待连接事件,当有连接时,再使用accept。

我确实使用了非阻塞,我现在就是想在不使用select的情况下直接调用accept,而且还要知道这次调用有没有成功建立连接(也就是说要知道有没有连接请求)

#5


现在我改成阻塞模式,奇怪的是在没有连接请求的情况下,程序还是不会停留在accept函数

#6


问题解决了,结帖

#7


不行啊,select无法检测 是否是有效的连接啊

#1


尽量避免使用select模型

#2


http://blog.csdn.net/yjgx007/archive/2005/01/03/237955.aspx

友情up~~~~

#3


在阻塞模式下,调用accept会阻塞,直到有连接进来或者有错误发生。   
 你的情况应该是使用了非阻塞模式,在这种情况下,accept会立刻返回,而不管是否有连接,因此在非阻塞模式时,
最好采用select,然后等待连接事件,当有连接时,再使用accept。

#4


引用 3 楼 zmlovelx 的回复:
在阻塞模式下,调用accept会阻塞,直到有连接进来或者有错误发生。  
你的情况应该是使用了非阻塞模式,在这种情况下,accept会立刻返回,而不管是否有连接,因此在非阻塞模式时, 
最好采用select,然后等待连接事件,当有连接时,再使用accept。

我确实使用了非阻塞,我现在就是想在不使用select的情况下直接调用accept,而且还要知道这次调用有没有成功建立连接(也就是说要知道有没有连接请求)

#5


现在我改成阻塞模式,奇怪的是在没有连接请求的情况下,程序还是不会停留在accept函数

#6


问题解决了,结帖

#7


不行啊,select无法检测 是否是有效的连接啊