关于网友提出的“ WinSock Select 问题?”问题疑问,本网通过在网上对“ WinSock Select 问题?”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: WinSock Select 问题?
描述:本帖最后由 VisualEleven 于 2011-05-30 09:36:28 编辑
Client.cpp
SOCKET clientSock;
addrinfo serverAddr;
if(CreateClientPort(AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP,
"jam", "2011", clientSock, serverAddr) == false)
{
return 0;
}
while(1)
{
char buf[1024];
memset(buf, sizeof(buf), 0);
cin>>buf;
if (strcmp("exit", buf) == 0)
{
break;
}
SendData(buf, sizeof(buf), clientSock, NULL);
}
return 0;
Server.cpp
SOCKET sock;
addrinfo serverAddr;
if (CreateServerPort(AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP, "2011", serverAddr, sock) == false)
{
return 0;
}
SOCKET clientSock;
Accept(NULL, NULL, clientSock, sock);
printf("connected\n");
fd_set sockSet;
while (true)
{
FD_ZERO(&sockSet);
FD_SET(clientSock, &sockSet);
timeval time;
time.tv_sec = 2;
time.tv_usec = 0;
if (select(0, &sockSet, NULL, NULL, &time) == 0)
{
printf("time out\n");
}
else
{
if (FD_ISSET(clientSock, &sockSet))
{
char buf[1024];
ReceiveData(buf, sizeof(buf), clientSock, NULL);
printf("%s\n", buf);
}
}
}
问题是为什么我的client端每次发一个字符串, 服务端会select会响应两次,第一次是打印出字符串,第二次打了一个?, 我debug的时候client端口只发送了一次, 为什么呢?~?~?~
解决方案1: 调试运行的时候有时候可能就是这样的哦,你把程序中select按他们说的改好,重起一下机器,或者禁用一下网卡,然后启用.
解决方案2: Select的read集合包括下面几种情况的套接字:
1.有数据可以读进
2.连接已经关闭,重设或者终止
3.调用listen后的accept
所以,当客户端发了一次之后断开了,服务端会接收到断开的信息,进入recv,由于是没有信息存在,所以读出来的是?
对于这种情况,最好的是充分利用recvfrom的返回值,大于0正常接收,等于0断开连接,小于0出错
解决方案3: select 的返回值你要判断一下,大于0的情况下才有有效数据,否则,读取的数据就不知道是什么了。而你只判断了等于0的情况,还有小于0的情况没判断。
以上介绍了“ WinSock Select 问题?”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/2980578.html