以下是服务端的Select部队,我在客户端发送一个字符串“hellow”,然后客户端退出,为什么在服务器端一直循环显示“hellow”。我不明白为什么执行过一次recv之后,FD_ISSET()还会有效,也就是说为什么hConnected还处于有数据接收的状态(而此时客户端已退出)?
其中,hConnected是一个已连接的SOCKET。while(1)
{
fd_set fd;
FD_ZERO(&fd);
FD_SET(hConnected, &fd);
nRet = select(0, &fd, NULL, NULL, NULL);
if(FD_ISSET(hConnected, &fd))
{
char buf[30];
int nBytes = recv(hConnected, buf, 30, 0);
buf[nBytes] = '\0';
cout << buf << endl;
}
}
其中,hConnected是一个已连接的SOCKET。while(1)
{
fd_set fd;
FD_ZERO(&fd);
FD_SET(hConnected, &fd);
nRet = select(0, &fd, NULL, NULL, NULL);
if(FD_ISSET(hConnected, &fd))
{
char buf[30];
int nBytes = recv(hConnected, buf, 30, 0);
buf[nBytes] = '\0';
cout << buf << endl;
}
}
解决方案 »
- 有关视频采集卡的一些小问题!
- 把一个子窗口中的内容拖到另一个窗口上,用那些东西?
- recvfrom用在线程函数中出现的一个问题
- 用CRecordSet打开的MySQL的表如何进行同步操作?
- 怎样通过修改C:\boot.ini文件为位于IDC Primary Master的硬盘的第一分区的win98提供引导,又没分了
- 如何在显示对话框后,将其中的几个Radio中的某一个设为默认?
- 一个COM使用问题.
- 发在软件工程论坛关于“管理和信誉度影响的问题”,这个问题在各个论坛都有,大家也来发表一下看法吧!!
- VC入门的一条路,一个暑假应该够用了。(转自vchelp)
- 扫描USB硬件时,如何获取设备的GUID
- 菜鸟提问:为什么现在大多用ADO而不用DAO?
- 在类中创建线程函数无法实现?
while(1)
{
fd_set fd;
FD_ZERO(&fd);
FD_SET(hConnected, &fd);
nRet = select(0, &fd, NULL, NULL, NULL);
if(FD_ISSET(hConnected, &fd))
{
char buf[30];
int nBytes = recv(hConnected, buf, 30, 0);
if(nBytes==SOCKET_ERROR)
{
if(WSAEWOULDBLOCK==WSAGetLastError())
continue;
/*错误处理*/
closesocket(hConnected);
hConnected=INVALID_SOCKET;
break;
}
buf[nBytes] = '\0';
cout << buf << endl;
}
}
//////////////////////////////////////////////////////
nRet = select(0, &fd, NULL, NULL, NULL);
if(nRet==SOCKET_ERROR)
break;