本帖最后由 VisualEleven 于 2012-08-08 22:20:51 编辑

解决方案 »

  1.   

    TCP发送一次,对方可能会需要接受多次;也可能发送多次,对方接受一次就完了
      

  2.   

    你看看你接收的数据对不?也许发了很多次,一次就收完了,何况你发送端的数据又不大,服务器端的buffer也够大
      

  3.   


    根本原因没有找到,采纳你的建议,加日志,发现:在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");            }
            }
      

  4.   

    你好,中午做实验的时候,收到了2次现在 一次都没有收到,原因:收到会printf现在是没有的。郁闷,代码逻辑我检测了,没有发现不对的地方。重要的是:WSAEvenSelect 代码里出现了2次,都正确使用了。!!!!
    无论是端口号,ip地址都是对的,采用netstat -an命令看了,却是9585端口使用了。建立了连接。添加新的连接后,我已经把g_index++了。 没问题啊 
      

  5.   

    问题解决了, 仅仅修改了3-4行代码:
    原因不知道, 谁能帮忙解答,为什么如此修改,就解决了这个问题了呢
    //轮训套接字
    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;
      

  6.   

    你之前的超时时间怎么设置成-1了?
    index=WSAWaitForMultipleEvents(1, &g_events[i], FALSE,0,FALSE); //难道是时间问题??
    改成这样不行么?
      

  7.   

    连接建立后,在for循环中,等待的是1个事件,就是连接请求。-1=INFINITE,于是死等。
    服务器不该这么写。主线程等待连接、退出等事件。accept以后再创建线程为其服务。
      

  8.   

    时间的意思 :-1------------------------- 永远在等,等到有信号,那么就会返回,否则永远不返回。
    你和10楼说的有道理,for循环从 第0个开始 等待。尽管 在for循环外部 用了WaitFormutipleEvents了,肯定有信号,才会指向for循环。可是如果第0个一旦没信号,而其他有信号,那么就堵塞了。谢谢你们了啊