解决方案 »
- 多线程查找时出现访问问题
- VC 为啥同一组数据出来的图形不一样呢 大家帮忙看看
- FindWindow()到底是做什么用的?看msdn实在没有理解。请大家给详细的说明一下。谢谢。
- 关于编辑框的问题
- 关于ClassXP控件界面库添加入工程后的编译问题
- ** 面试题目:应用程序如何和其他DLL共享全局变量, 考虑扩展性和兼容性? **
- 关于获取文件路径,返回值的问题
- 如何编程序选择其他应用程序的对话框中的SysTreeView32节点?
- 有一种说法——能够放入对象池的的对象都应该是无状态的。这个无状态是什么意思?我们用ATL作组件的时候,不选这支持MTS是否可以放入对象池?
- 怎样对数据库的表的货币值求和
- 客户机连接服务器的问题?
- 关于LoadImage()函数的奇怪问题。。。。。。
根本原因没有找到,采纳你的建议,加日志,发现:在for循环中的一句:WaitForMutipleEvents 这里挂了。
重新说: 中午做实验,发现还能接受2次数据,现在一次都收不到了接受了客户端套接字后,就死在了for循环的WaitformutpleEvents这里客户端套接字已经接受了。我发部分加了日志的代码啊: for(int i=0 ;i <g_index; i++)
{ printf("下一步进入for循环内部的 等待事件对象有信号函数\n"); index=WSAWaitForMultipleEvents(1, &g_events[i], TRUE,-1,FALSE); printf("已经离开了for循环内部的的 等待事件对象有信号函数\n"); WSAEnumNetworkEvents(g_socks[i],g_events[i],&wsaNWEs); if(wsaNWEs.lNetworkEvents& FD_ACCEPT) //接受(监听套接字会发生)
{
printf("进入了接受套接字\n"); sockaddr_in tmpsockaddr; SOCKET s; int nLen=sizeof(tmpsockaddr); s=accept(g_listenSock,(sockaddr*)&tmpsockaddr,&nLen); //创建事件,并对其进行设置
g_socks[g_index]=s; WSAEVENT tempEvent=WSACreateEvent(); g_events[g_index]=tempEvent;
WSAEventSelect(g_socks[g_index],g_events[g_index],FD_READ|FD_WRITE|FD_CLOSE); g_index++; printf("离开接受套接字\n"); } else if(wsaNWEs.lNetworkEvents& FD_READ) //接受数据
{
printf("进入接受数据\n");
char buf[200];
ZeroMemory(buf,200);
recv(g_socks[i],buf,200,0);
printf("%s\n",buf); printf("离开接受数据\n"); }
else if(wsaNWEs.lNetworkEvents& FD_CLOSE) //关闭
{
printf("进入关闭\n"); //把最后一个套接字移动到这里 closesocket(g_socks[i]); g_socks[i]=g_socks[index-1];
index--;
i--; //注意有个i++ printf("离开关闭\n"); }
}
无论是端口号,ip地址都是对的,采用netstat -an命令看了,却是9585端口使用了。建立了连接。添加新的连接后,我已经把g_index++了。 没问题啊
原因不知道, 谁能帮忙解答,为什么如此修改,就解决了这个问题了呢
//轮训套接字
for(int i=0 ;i <g_index; i++)
{
// index=WSAWaitForMultipleEvents(1, &g_events[i], TRUE,-1,FALSE); //难道是时间问题??
index=WSAWaitForMultipleEvents(1, &g_events[i], TRUE,100,FALSE);
if(index==WSA_WAIT_FAILED|| index==WSA_WAIT_TIMEOUT)
continue;
index=WSAWaitForMultipleEvents(1, &g_events[i], FALSE,0,FALSE); //难道是时间问题??
改成这样不行么?
服务器不该这么写。主线程等待连接、退出等事件。accept以后再创建线程为其服务。
你和10楼说的有道理,for循环从 第0个开始 等待。尽管 在for循环外部 用了WaitFormutipleEvents了,肯定有信号,才会指向for循环。可是如果第0个一旦没信号,而其他有信号,那么就堵塞了。谢谢你们了啊