我的程序里有时会有多个线程同时向服务器A发送数据,有时候会出现在向服务器A发送数据的同时,服务器A也在向我发送数据。这种时候我就会收不到服务器的数据,而且从此以后再也收不到服务器A发来的数据了,但可以向服务器A发送数据又是正常的
想问下有没有人也遇到这种情况,这种情况是不是正常会出现的,还是我的程序写得有问题呢?
请高手解答

解决方案 »

  1.   

    TCP/IP连接不会出现这种情况.
    所有的接收数据都丢进了recv buffer.
    发送的数据都丢进send buffer.
    这两个网络缓存是互不影响的。你说收不到server发来的数据,那server send();成功了吗?
    client recv();的返回值是多少?我怀疑跟你的接受处理有关系。
      

  2.   

    server send()是成功的
    client recv()的返回值我没有单步跟踪过,不晓得是多少,但肯定不是0和SOCKET_ERROR,因为如果是这2个值我的程序是会有显示的
      

  3.   

    我现在的跟服务器之间的线程是这样的,请帮忙看看有什么问题
    while (TRUE)
    {
            //收到退出事件,结束线程
    if (WaitForSingleObject(pSocket->m_exitThreadEvent,0) == WAIT_OBJECT_0)
    {
    break;
    }
    //置空fdRead事件为空
    FD_ZERO(&fdRead);
    //给客户端socket设置读事件
    FD_SET(pSocket->m_socket,&fdRead);
    //调用select函数,判断是否有读事件发生
    ret = select(0,&fdRead,NULL,NULL,&aTime);

    if (ret == SOCKET_ERROR)
    {
    //触发错误事件
    pSocket->OnError(pSocket->m_pOwnerWnd,1);
    //触发连接断开事件
    pSocket->OnDisConnect(pSocket->m_pOwnerWnd);
    pSocket->Close();
    break;
    }


    if (ret > 0)
    {
    if (FD_ISSET(pSocket->m_socket,&fdRead))
    {
    //发生读事件
    char recvBuf[1024];
    int recvLen;
    ZeroMemory(recvBuf,1024);
    //接收数据
    recvLen = recv(pSocket->m_socket,recvBuf, 1023,0); 
    if (recvLen == SOCKET_ERROR)
    {
    int iError = WSAGetLastError();
    //触发socket错误事件
    pSocket->OnError(pSocket->m_pOwnerWnd,iError);
    //触发与服务器断开事件
    pSocket->OnDisConnect(pSocket->m_pOwnerWnd);
    pSocket->Close();
    break;
    }
    else if (recvLen == 0)
    {
    int iError = WSAGetLastError();
    //触发socket错误事件
    pSocket->OnError(pSocket->m_pOwnerWnd,iError);
    //触发与服务器端断开事件
    pSocket->OnDisConnect(pSocket->m_pOwnerWnd);
    }
    else
    {
      //触发数据接收事件
                                           pSocket->OnRead(pSocket->m_pOwnerWnd,recvBuf,recvLen);
    }
    }
    }