在主线程中创建Listensocket,并bind、listen
主线程创建一线程while(1)死循环负责accept客户端connect请求,代码如下
while (1)
{
if ((NewConnection = accept(ListeningSocket, NULL,
            NULL)) == INVALID_SOCKET)
        {
            continue;
        }        Ret = recv(NewConnection, DataBuffer, DATE_BUFFER_SIZE, 0);
}问题来了,调试的时候客户端连接服务器发送数据,客户端返回值表示send成功
不过在服务器端recv处设置断点,发现有时候客户端发送成功了,但是服务器端没有执行到recv,没有接收数据,一直在accept处循环这种情况不是一直出现,有时候重启服务器端进程一切都正常,有时候重启了就发生上面的问题
而且只要服务器端进程第一次recv成功,以后都可以正常recv
第一次recv不到,以后的都没有recv到

解决方案 »

  1.   

    你都没退出循环哈
    if ((NewConnection = accept(ListeningSocket, NULL,
    NULL)) == INVALID_SOCKET)
    {
    continue;
    }else
    {
        break;
    }
      

  2.   

    不能退出循环,服务器端要一直listen,接收数据后我是另开线程处理数据的
      

  3.   

    你的意思是一直接受新的连接?
    那你就得
    if ((NewConnection = accept(ListeningSocket, NULL,
    NULL)) == INVALID_SOCKET)
    {
    continue;
    }
    createthread(...)...;
    创建线程来接收了
    因为程序执行不下去啊
      

  4.   

    关键是程序一直在accept处循环,执行不到后面的代码
    象你上面的代码都无法执行到createthread(...)
      

  5.   

    这样改if ((NewConnection = accept(ListeningSocket, NULL,
    NULL)) == INVALID_SOCKET)
    {
    //去掉continue;
    }
    if(NewConnection != INVALID_SOCKET )
        Ret = recv(NewConnection, DataBuffer, DATE_BUFFER_SIZE, 0);
    因为有可能,先运行循环再收到数据,那样就下不来了
      

  6.   

    还是不太合理
    主要是你的NewConnection每次都被重置,所以你要用个数组什么的
      

  7.   

    直接在主线程while(1)死循环负责accept客户端connect请求,数据可以正常接收
    不过主线程被阻塞了,UI没办法响应
      

  8.   

     不是不能正常接收吗?
    最好的办法是创建一个线程来接收,accept最好也要创建线程
    你这样都不合理
      

  9.   

    NewConnection = accept(ListeningSocket, NULL,
    NULL)
    这个函数的第三个参数被默认为0,那么系统认为你的存储空间为0,当然是错误了,
     lenth = sizeof(sockaddr_in) //*需要放在循环里面*
        socket_new = accept(socket, (struct sockaddr *)&saddr_c, &lenth);
        if (socket_new == -1) {
            if (errno == EINTR) {
                continue;
            }
            return -1;
        }
      

  10.   

    楼上的正解。    int newSocket;   // the new socket file descriptor returned by the accept systme call
        
        // the length of the client's address
        int clientAddressLen = sizeof(struct sockaddr_in);
        struct sockaddr_in clientAddress;    // Address of the client that sent data
        
        // Accepts a new client connection and stores its socket file descriptor
        
        if ((newSocket = accept(m_hSocket, (struct sockaddr *)&clientAddress,&clientAddressLen)) == -1)

    // 错误处理
    }// 创建线程进行消息处理
      

  11.   

    你们估计有点误解我的意思了
    accept接收的一直是无效连接,尽管客户端显示connent和send成功
    顺便说下,测试的时候客户端和服务器端在一台机器上
      

  12.   


    和这个没关系,accept后面连个参数可以为NULL
      

  13.   

    你的客户端是发送数据以后就关闭socket了吗?
      

  14.   


    恩,客服端send以后就关闭了
    send虽然有延时,不过和这里出现的问题没有关系
      

  15.   

    netstat显示,客户端发送后显示FIN_WAIT_2
    服务器端显示CLOSE_WAIT
      

  16.   

    问题解决,犯了一个很S13的错误
    主线程创建的ListenSocket是一个临时变量,传到listen线程后已经被系统释放了
    不过也很奇怪,客服端竟然连接发送成功