关于select的问题
在局域网内,客户端不知道服务器端的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");
}
在以下列举的情况中,客户端“不能正常连上服务器端”,但这里的“不能正常连上”指的是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");
}
...全文
相关推荐
layui之select的option叠加问题的解决方法
下面小编就为大家分享一篇layui之select的option叠加问题的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
基于Jquery模拟Select,解决IE显示问题
基于Jquery模拟Select,解决IE显示问题
解决layer 动态加载select 失效的问题
今天小编就为大家分享一篇解决layer 动态加载select 失效的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
解决Antd 里面的select 选择框联动触发的问题
有两个 select框,且这俩select框是关联的,触发select1,select2里面才会有值。 但是现在的问题是这样的: 触发select1,触发select2,再触发select1,此时select2里面的值变成了上次一选中的value 值,而不会被清空。 解决办法: 使用Select 里面的value属性,来进行清空 <Form style={{padding:'20px','boxSizing':'border-box'}}> <Select defaultValue={packag
解决bootstrap-select 动态加载数据不显示的问题
今天小编就为大家分享一篇解决bootstrap-select 动态加载数据不显示的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧


网络编程

