双11狂欢大促

盲盒赢 定制羽绒服

开启惊喜盲盒,抽取你的专属好礼

— 惊喜奖品抢先看 —

关于select的问题

renshuming renshuming 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
在局域网内,客户端不知道服务器端的ip地址,所以用ip地址依次尝试的方式连接服务器端,将connect设为非阻塞,用select控制超时。现在有如下几个困惑请教各位:

在以下列举的情况中,客户端“不能正常连上服务器端”,但这里的“不能正常连上”指的是select返回值不正确,即不为大于0的值。但是服务器端的打印显示accept是成功了的。

1,假如服务器端ip地址为...101,我从...92开始依次尝试连接(101是尝试连接的第10个ip),尝试到ip...101时能够连接成功(即select返回大于0的值)。但是只要从小于92的ip开始依次尝试连接,就不能成功(select的超时时间设为100ms,但是我试着改为200、300ms,照样不行);
2,如果执行调试,即单步跟踪什么的,能连接成功;
3,如果将select的超时改为2秒以上,就能一切正常。

我对以上的现象相当困惑,请各位帮助。

关键部分代码如下:
int sock = socket(AF_INET, SOCK_STREAM, 0);
struct fd_set writeSet;
struct timeval timeConn;
u_long opt = 1;

ioctlsocket(sock, FIONBIO, &opt);

writeSet.fd_count = 1;
writeSet.fd_array[0] = sock;

/*现在是200ms,不行,改为几百ms都不行*/
timeConn.tv_sec = 0;
timeConn.tv_usec = 200 * 1000;

/*这样就行了*/
/*timeConn.tv_sec = 2;
timeConn.tv_usec = 0;*/

if (0 != connect(sock, (struct sockaddr*)&addr, sizeof(addr)))
{
if (select(1, NULL, &writeSet, NULL, &timeConn) > 0)
{
opt = 0;
ioctlsocket(sock, FIONBIO, &opt);
printf("Connect succeed!\n");
}
else
{
printf("Connect failed!\n");/*不正常的时候分支走到这里,但是服务器端已经accept成功了……*/
closesocket(sock);
}
}
else
{
opt = 0;
ioctlsocket(sock, FIONBIO, &opt);
printf("Connect succeed!\n");
}
...全文

相关推荐

评论 4
收藏 已收藏
分享
返回顶部
renshuming
网络编程 18,356 成员 64,161 内容