在局域网内,客户端不知道服务器端的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!");
}
else
{
printf("Connect failed!");/*不正常的时候分支走到这里,但是服务器端已经accept成功了……*/
closesocket(sock);
}
}
else
{
opt = 0;
ioctlsocket(sock, FIONBIO, &opt);
printf("Connect succeed!");
}
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!");
}
else
{
printf("Connect failed!");/*不正常的时候分支走到这里,但是服务器端已经accept成功了……*/
closesocket(sock);
}
}
else
{
opt = 0;
ioctlsocket(sock, FIONBIO, &opt);
printf("Connect succeed!");
}
解决方案 »
- 请问对象析构的问题
- OPenGl 虚拟漫游问题 急,谢谢!!
- 关于MFC设计UI方面的问题
- 在STL编程中使用CString的问题
- 如何对对话框中的CListCtrl中的数据进行Serialize操作
- 如何在InstallShield for Microsoft VC++6.0中制作反安装软件。
- ***小问题,高分数,来者有分,在vc中如何实现多标签的形式?***
- CTreeCtrl的问题,对不起,没分了,帮帮我,各位给看一下吧
- 内核下改写一个函数自己内容,会写入时拷贝吗
- 有关CDib类GetPixel(x,y)的使用问题,高手请进,thx
- 如何查看本系统中所安装的软件信息啊?就如同优化大师/添加与删除中做的一样?我想自己写程序实现.
- CDataGRid如何在VS2003中声明?
或者用sockmon 调试