在winsock基于TCP通信程序中,
客户端和服务器端可以通信几次,然后,服务器端就不能接收到客户端发送的信息,但是跟踪显示,客户端发送成功了,
这种情况应该怎么解决呢?

解决方案 »

  1.   

    服务器端每次都发相同的数据,放在pcSendBuf里。
    pcSendBuf[0]    = 'Z';
    pcSendBuf[1]    = 0xFF;
    pcSendBuf[2]    = 0xFF;
    pcSendBuf[3]    = 0xA1;
    pcSendBuf[4]    = 0x00;
    pcSendBuf[5]    = 0x04;
    pcSendBuf[6]    = 'b';
    pcSendBuf[7]    = 'a';
    pcSendBuf[8]    = 'b';
    pcSendBuf[9]    = 'y';
    pcSendBuf[10]   = NULL;
    服务器根据客户端发送的信息,判断是重发,还是发下一条信息。
    void CMyServerDlg::OnReceive(CMySocket *pSocket)
    {
    Sleep(100);
    m_lstShowMsg.AddString("");
    m_lstShowMsg.AddString("have received!"); unsigned char  *pBuf = new unsigned char[1025]; // 接收同步字符
    int  i;
    int nRevBytes = pSocket->Receive(pBuf, 1024, MSG_PEEK);

    for(i=0; i<nRevBytes; i++)  //找同步字符0xFF的位置
    {
    if(0xFF==pBuf[i] && (0xF1==pBuf[i+1] || 0xF0 == pBuf[i+1]))
    {
    break;  //跳出for循环
    }
    }
    pSocket->Receive(pBuf, i);    // 清除0xFF以前的字符
    if (i< nRevBytes)  // 找到同步字符
    {
    nRevBytes = pSocket->Receive(pBuf, 4);
    if (pBuf[1] == 0xF0)   // 将数据重发
    {
    m_lstShowMsg.AddString("failure!");
    int ii, kk;
    kk = m_sAcceptSocket.GetCount();
    for (ii=0; ii<kk; ii++)
    {
    nErr = m_sAcceptSocket.GetAt(m_sAcceptSocket.FindIndex(ii))->Send(pcSendBuf, 10);
    AfxMessageBox("重发!");
    }
    delete []pName;
    delete []pBuf;
    return;
    }
    else if (pBuf[1] == 0xF1) // 发送成功,继续发送下一帧
    {
    m_lstShowMsg.AddString("success!");
    SendData();
    delete []pName;
    delete []pBuf;
    return;
    }

    }
    }
    客户端接受服务器发送的帧,提取出数据内容:
    void CMyClientDlg::OnReceive()
    {
    Sleep(100);
    switch(m_nRevState)
    {
    case STATE_NULL:     // 搜索同步字符0xFF
    {
    int  i;
    CString strReceived;
    m_nRevBytes = m_ClientSocket.Receive(pBuf, 1024, MSG_PEEK);

    for(i=0; i<m_nRevBytes; i++)  //找同步字符0xFF的位置
    {
    if(0xFF==pBuf[i] && 0xA1==pBuf[i+1])
    {
    break;  //跳出for循环
    }
    }
    m_ClientSocket.Receive(pBuf, i);    // 清除0xFF以前的字符 if (i<m_nRevBytes)   // 找到了同步字符,更改状态
    {
    m_nRevState = STATE_SYN;
    }
    m_nRevBytes = 0;
    break;
    }

    case STATE_SYN:         // 搜索帧头
    {
    m_nRevBytes = m_ClientSocket.Receive(pBuf, 4); if (m_nRevBytes < 4)  // 接受失败,要求重发
    {
    puchSendBuf[0] = 0xFF;
    puchSendBuf[1] = 0xF0;
    puchSendBuf[2] = 0x00;
    puchSendBuf[3] = 0x00;
    m_ClientSocket.Send(puchSendBuf, 4);
    m_lstShowMsg.AddString("resend!\n");
    m_nRevState    = STATE_NULL;
    m_nRevBytes    = 0;
    break;   
    }

    if (pBuf[0]==0xFF && pBuf[1]==0xA1)
    {
    m_unFraLen = pBuf[2];
    m_unFraLen <<= 8;
    m_unFraLen +=  pBuf[3];

    m_nRevState = STATE_REV;
    m_nRevBytes = 0;
    } else
    {
    m_nRevState = STATE_NULL;
    m_nRevBytes = 0;
    }
    break;
    } case STATE_REV:       // 接受数据
    {
    m_lstShowMsg.AddString("have received!");
    m_nRevBytes = m_ClientSocket.Receive(ucRev, m_unFraLen);

    if ((UINT)m_nRevBytes<m_unFraLen)
    {

    puchSendBuf[0] = 0xFF;
    puchSendBuf[1] = 0xF0;
    puchSendBuf[2] = 0x00;
    puchSendBuf[3] = 0x00;
    m_ClientSocket.Send(puchSendBuf, 4);
    m_lstShowMsg.AddString("resend!\n");
    m_nRevState    = STATE_NULL;
    m_nRevBytes    = 0;
    break;
    }
    ucRev[m_nRevBytes] = NULL; m_nCount++;
    CString strShow ;
    strShow.Format("%d   ", m_nCount);
    strShow += ucRev;
    m_lstShowMsg.AddString(strShow); m_unFraLen = 0;
    m_nRevState = STATE_NULL; puchSendBuf[0] = 0xFF;
    puchSendBuf[1] = 0xF1;
    puchSendBuf[2] = 0x00;
    puchSendBuf[3] = 0x00;
    if (m_ClientSocket.Send(puchSendBuf, 4)==4)
    {
    m_lstShowMsg.AddString("send success!");
    m_lstShowMsg.AddString("");
    }
    m_nRevState    = STATE_NULL;
    m_nRevBytes    = 0; break;
    }
              }
    }
      

  2.   

    请检查socket listen(参数).参数是不是取得默认值,系统默认值为5个连接,大于就会出现阻塞.或者是你在接收到连接请求后没有产生新的socket实例.如果需要我给你部分代码.