当Client连上server时, server发送数据, client能收到, client再发条数据给server时, server就收不到了,同时server发送也就会显示失败,导致client也就不能收到数据.这是什么原因?注: 如果server一直发送, client一直接没有问题, 或者是client一直发,server一直送也没有问题.以下是Server 的Code
//Server Accept
if(m_hSocketConn != INVALID_SOCKET)
{
closesocket(m_hSocketConn);
m_hSocketConn = INVALID_SOCKET;
}    m_hSocketConn = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_hSocketConn == INVALID_SOCKET) 
{
return FALSE;
} SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
//addrSrv.sin_addr.s_addr = inet_addr(IPADDR);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(m_nPort); if (bind(m_hSocketConn, (SOCKADDR*) &addrSrv, sizeof(addrSrv)) == SOCKET_ERROR)
{
closesocket(m_hSocketConn);
m_hSocketConn = INVALID_SOCKET;
        return FALSE;
    } if (listen(m_hSocketConn, 5) == SOCKET_ERROR)
{
closesocket(m_hSocketConn);
m_hSocketConn = INVALID_SOCKET;
return FALSE;
}
    
m_hAccept = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)AcceptThread, this, 0, NULL);
m_bAccept = TRUE;
void CWIFIDevice::AcceptThread(LPVOID lParam)
{
CWIFIDevice *pWIFIDevice = (CWIFIDevice*)lParam;
SOCKADDR_IN addrClient;
int nLen = sizeof(SOCKADDR); while(pWIFIDevice->m_bAccept)
{
Sleep(10); if(pWIFIDevice->m_hSocketServer == INVALID_SOCKET)
{
pWIFIDevice->m_hSocketServer = accept(pWIFIDevice->m_hSocketConn, (SOCKADDR*)&addrClient, &nLen);
MessageBox(NULL, L"Accept", 0, 0);
}
}
}//Server Send
int CWIFIDevice::SendData(char* pszData, int nSize)
{
if (m_hSocketServer == NULL)
       return 0; int nSend = send(m_hSocketServer, pszData, nSize, 0); return nSend;
}//Server Recv
int CWIFIDevice::RecvData(char* pszData, int nSize)
{
if (m_hSocketServer == NULL)
       return 0; int nRecv = recv(m_hSocketServer, pszData, nSize, 0); return nRecv;
}

解决方案 »

  1.   

    Client的Code如下:BOOL CWIFIDevice::Connect()
    {
    if(m_hSocket != INVALID_SOCKET)
    {
    closesocket(m_hSocket);
    m_hSocket = INVALID_SOCKET;
    } m_hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (m_hSocket == INVALID_SOCKET) 
    {
    m_hSocket = NULL;
    return FALSE;
    } SOCKADDR_IN addrSrv;
    addrSrv.sin_addr.S_un.S_addr=inet_addr(m_szIPAddress);
    addrSrv.sin_family=AF_INET;
    addrSrv.sin_port=htons(m_nPort);

    connect(m_hSocket, (SOCKADDR *)&addrSrv, sizeof(addrSrv));

    Sleep(3000);
    //SendData("CONNECT", 7);
    return TRUE;
    }int CWIFIDevice::SendData(char *pszData, int nSize)
    {
    if (m_hSocket == NULL)
    return 0; int nSend = send(m_hSocket, pszData, nSize, 0); return nSend;
    }int CWIFIDevice::RecvData(char *pszData, int nSize)
    {
    if (m_hSocket == NULL)
    return 0; return recv(m_hSocket, pszData, nSize, 0);
    }
      

  2.   

    WSAGetLastError()函数返回什么???
      

  3.   

    当server先发给client, client收到再回给server, server就收不到了,但是如果是一直发的话,没问题
     是server的recv, 还是client的recv存在问题
      

  4.   

    你是不是调用上有问题
    比如client发送的时候又调用了connect等
    然后看看你server端发送失败的那个错误代码是什么?
      

  5.   

    An existing connection was forcibly closed by the remote host. 
    连接被强制关闭了
    你是不是调用了 closesocket 之类的?
      

  6.   

    一般结合自己的使用方式,在查看GETLASTERROR分析