为什么select函数返回的总是1? 本帖最后由 VisualEleven 于 2010-10-28 10:36:40 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 因为client上有数据可读,但是你一直没有读 void CTcpClientDlg::OnConnect() //button{ sock=socket(AF_INET,SOCK_STREAM,0); if (sock==INVALID_SOCKET) { AfxMessageBox("socket创建失败"); return ; } sockaddr_in saddr; saddr.sin_family=AF_INET; saddr.sin_addr.s_addr=inet_addr(m_toIp); saddr.sin_port=htons(m_toPort); if (0!=connect(sock,(sockaddr*)&saddr,sizeof(saddr))) { AfxMessageBox("connect失败"); return ; } char buf[]="hello"; send(sock,buf,strlen(buf),0); closesocket(sock);}这是发送代码 首先要设置其阻塞模式,调用ioctlsocket()这个函数,你MSDN或者google一下看看 你这个OnConnect在循环的回调吧 楼主不理解select模型啊...http://www.cnblogs.com/Jimmly/archive/2009/07/23/1529529.html 改成select(client+1,&readfds,NULL,NULL,&time); recv(client,buf,sizeof(buf),0);这个地方需要判断返回值,等于-1出错,等于0正常关闭,大于0,表示收到的数据大小windows下第一个参数忽略,unix下面,该参数必须为SET进去的socket最大值+1 windows下也不能完全忽略,也可能存在需要加1的情况 不解,如果SELECT返回的不是1那应该是多少,你只是把一个通信SOCKET加入到读集中去,如果有与其相应的消息发送来,当然应该返回1了~~~ 不解,难道与int 和 SOCKET有关? 你的while循环中的select写的有些问题。while(TRUE){ fd_set fdRead = fdSocket; int nRet = select(0, &fdRead, NULL, NULL, NULL); if(nRet > 0) { for(int i=0; i<(int)fdSocket.fd_count; i++) { if(FD_ISSET(fdSocket.fd_array[i], &fdRead)) { if(sListen == fdSocket.fd_array[i]) { if(fdSocket.fd_count < FD_SETSIZE) { SOCKADDR_IN addr; memset(&addr, 0, sizeof(addr)); int len = sizeof(addr); SOCKET sNew = accept(sListen, (LPSOCKADDR)&addr, &len); if(INVALID_SOCKET == sNew) { // Error continue; } FD_SET(sNew, &fdSocket); } else { printf("Too much connections.\n"); continue; } } else { char szbuf[256] = {0}; int nRecv = recv(fdSocket.fd_array[i], szbuf, 256, 0); if(nRecv > 0) { printf("recv data: %s", szbuf); } else { closesocket(fdSocket.fd_array[i]); FD_CLR(fdSocket.fd_array[i], &fdSocket); } } } } } else { printf("select failed with error code: %d", WSAGetLastError()); break; }} 我被挖了,散分! 位图处理的一些问题 使用Winpcap抓包,有以下疑惑,希望得到高手指点! 怎么自动安装自己写好的协议呢?急高分求解 关于串口操作的问题 使用ODBCAPI,如何获取数据库表的中说明属性内容? Visual C++ 技术内幕是买第六版还是第四版?我的开发平台是vc6.0 关于windows消息的获取,并能在windows前执行或取消。 支离破碎的OpenGL 哪里错了 ADO连接access数据库时查询显示的问题 求正版的英文版Visual Studio 2005
void CTcpClientDlg::OnConnect() //button
{
sock=socket(AF_INET,SOCK_STREAM,0);
if (sock==INVALID_SOCKET)
{
AfxMessageBox("socket创建失败");
return ;
}
sockaddr_in saddr;
saddr.sin_family=AF_INET;
saddr.sin_addr.s_addr=inet_addr(m_toIp);
saddr.sin_port=htons(m_toPort); if (0!=connect(sock,(sockaddr*)&saddr,sizeof(saddr)))
{
AfxMessageBox("connect失败");
return ;
}
char buf[]="hello";
send(sock,buf,strlen(buf),0);
closesocket(sock);
}
这是发送代码
你这个OnConnect在循环的回调吧
recv(client,buf,sizeof(buf),0);
这个地方需要判断返回值,等于-1出错,等于0正常关闭,大于0,表示收到的数据大小
windows下第一个参数忽略,unix下面,该参数必须为SET进去的socket最大值+1
windows下也不能完全忽略,也可能存在需要加1的情况
while(TRUE)
{
fd_set fdRead = fdSocket;
int nRet = select(0, &fdRead, NULL, NULL, NULL);
if(nRet > 0)
{
for(int i=0; i<(int)fdSocket.fd_count; i++)
{
if(FD_ISSET(fdSocket.fd_array[i], &fdRead))
{
if(sListen == fdSocket.fd_array[i])
{
if(fdSocket.fd_count < FD_SETSIZE)
{
SOCKADDR_IN addr;
memset(&addr, 0, sizeof(addr));
int len = sizeof(addr);
SOCKET sNew = accept(sListen, (LPSOCKADDR)&addr, &len);
if(INVALID_SOCKET == sNew)
{
// Error
continue;
}
FD_SET(sNew, &fdSocket);
}
else
{
printf("Too much connections.\n");
continue;
}
}
else
{
char szbuf[256] = {0};
int nRecv = recv(fdSocket.fd_array[i], szbuf, 256, 0);
if(nRecv > 0)
{
printf("recv data: %s", szbuf);
}
else
{
closesocket(fdSocket.fd_array[i]);
FD_CLR(fdSocket.fd_array[i], &fdSocket);
}
}
}
}
}
else
{
printf("select failed with error code: %d", WSAGetLastError());
break;
}
}