【发布时间】:2011-10-19 10:30:19
【问题描述】:
这是我现在使用的部分代码。
fd_set fdset;
struct timeval tv;
int flags = fcntl(sockfd, F_GETFL);
fcntl(sockfd, F_SETFL, O_NONBLOCK);
connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr));
FD_ZERO(&fdset);
FD_SET(sockfd, &fdset);
tv.tv_sec = 3;
tv.tv_usec = 0;
if (select(sockfd + 1, NULL, &fdset, NULL, &tv) == 1)
{
int so_error;
socklen_t len = sizeof so_error;
getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &so_error, &len);
if (so_error == 0) {
cout << " - CONNECTION ESTABLISHED\n";
}
} else
{
cout << " - TIMEOUT\n";
exit(-1);
}
我不太清楚 select() 函数是如何工作的,这里的伪代码是我真正想做的,
bool showOnce = true;
connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr))
while(stillConnecting) /*Some kind of flag of connection status*/
{
if(showOnce)
{
showOnce = false;
cout << "Connecting";
}
}
if(connected) /*Another possible flag if it exists*/
return true;
else
return false;
有没有办法实现这个伪代码,这些标志存在吗?
编辑:为什么 sockfd+1 在上面代码的选择函数中?为什么要加一个?
【问题讨论】:
-
阅读
select()的文档时,您学到了什么? -
我还没有真正学习,对不起,我主要做嵌入式开发,需要编写一个快速的pc程序来进行简单的通信。在我写这篇评论时,我目前正在阅读关于 select 功能的 msdn 页面。我想我可以用它来检查套接字的状态,就像在伪代码中一样。试图弄清楚如何。我到了:)