关于accept 返回的socket的阻塞属性

测试结果返回的这个socket也是阻塞的,同其他socket默认形式相同。(xp,vs08)recv函数一直卡在那。
当手动设置后,即可:
newconnection =accept(listeningSocket,(SOCKADDR *)&clientAddr, &len);
u_long ulFlag = 1;
ioctlsocket(newconnection,FIONBIO,&ulFlag);//过后recv就直接返回了

返回值-1,WSAGetLastError()返回值10035,即WSAEWOULDBLOCK,


要是listen的那个socket设为非阻塞的,accept返回的那个socket在不手动修改的情况下也就也已经是非阻塞的了。
listen的socket设为非阻塞后,accept返回的socket在没接到连接的时候值大小为INVALID_SOCKET,(无符号整型,32位1)。获取上次WSA错误返回值也是10035,形式类似recv


accept返回的socket是阻塞的还是非阻塞的?
我是在windwos xp上测试的,结果和accept对应的socket有关系,如果accept传入的socket是阻塞的那么返回的socket如果是正确的就是阻塞的,反之如果传入accept的socket是非阻塞的那么就是非阻塞的。
我的程序是一个简单的转发,想设置accept的超时,所以设置了传入accept的socket是非阻塞的,结果测试发现accept返回的socket发送send数据总是有10035错误;如果accept传入的socket不是非阻塞的,就没有这个问题,所以我觉得与传入accept的socket是否阻塞有关系;


MSDN

Remarks
The accept function extracts the first connection on the queue of pending connections on socket s. It then creates and returns a handle to the new socket. The newly created socket is the socket that will handle the actual connection; it has the same properties as socket s, including the asynchronous events registered with the WSAAsyncSelect or WSAEventSelect functions.


Linux的待测试!

你可能感兴趣的:(网络编程)