正确设置非阻塞套接字后,我会执行以下连接:
这是对的吗?我应该检查fd_write不是fd_read吗?我应该在选择后调用getsockopt吗?有什么论据? 我无法找到需要做什么的明确解释。
我连接但我的程序没有正确报告,所以我使用选择错误,或者是因为我没有检查getsockopt。
我告诉我连接是什么?
答案 0 :(得分:2)
- 在套接字上调用connect。
- 如果它返回0,我已经连接,如果没有,请检查errno。
- 如果errno不是EINPROGRESS则会出错。
醇>
以上所有内容都是正确的(除非在Windows下,您需要检查WSAEWOULDBLOCK而不是EINPROGRESS)。
- 如果errno是EINPROGRESS我可以通过以下方式轮询连接状态:select_status = sock_select(FD_SETSIZE,NULL,&file_descriptor_set,NULL,& timeout);如果select_status> 0然后检查FD_ISSET是否设置了文件描述符。
醇>
正确(假设sock_select()与select()相同),但FD_SETSIZE应该是您正在观看的所有文件描述符值的最大值加上1.
这是对的吗?我应该检查fd_write不是fd_read吗?
右。
是什么告诉我连接已经完成?
当async-connection-operation完成后,select()将返回,FD_ISSET(theSocket,& writeSet)将返回true。
当发生这种情况时,您需要确定连接尝试是成功还是失败。这是我用来做的一个功能:
// Returns true if the async connection on (fd) is connected; false if it failed
bool DidTheAsyncTCPConnectionSucceed(int fd)
{
struct sockaddr_in junk;
socklen_t length = sizeof(junk);
memset(&junk, 0, sizeof(junk));
return (getpeername(fd, (struct sockaddr *)&junk, &length) == 0);
}
如果返回true,则套接字已连接并准备好以正常方式使用。如果它返回false,则async-connection失败,你应该关闭()套接字并以某种方式处理该失败。
(同样在Windows下有一个稍微不同的行为;在Windows下,获得有关连接成功的通知如上所述,但如果您想要获得有关连接失败的通知,则需要查看异常-fd -set。在Windows下,FD_ISSET(fd,& exceptionSet)将在异步TCP连接失败时通知您。