您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> VC/MFC >> WinSock Select 问题?

WinSock Select 问题?

来源:网络整理     时间:2016/7/28 5:49:10     关键词:

关于网友提出的“ 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

相关图片

相关文章