一个类似QQ的小的聊天系统,服务器端口开放了三个,用外网和内网都做了测试,服务器端在接受客户端的登录请求时,内网的一个都登陆不上去,外网测试了5个人,只有两个能登陆上这是因为什么原因啊?

解决方案 »

  1.   

    登陆是该用TCP协议还是UDP协议呢??我用的是UDP协议啊
      

  2.   

    与具体的协议无关的
    无论是哪个协议都可以解决这类需要的
    你程序的错误码是什么,用GetLastError获得
      

  3.   


    UDP可能会丢包。要么,重试登陆,要么改用TCP.
      

  4.   

    我大体知道了错误的地方,但是不知道是何原因,我把代码贴出来,大家帮着看看,问题应该是出在客户端ReceiveFrom和服务器端SendTo上面,
    服务器端
    ASSERT(pData!=NULL);
    ASSERT(m_nSendSocket&&m_nRecvSocket);

    int times=0,iCurIndex;
    BOOL bSendSuccess=FALSE;
    m_nTotalSend++;
    iCurIndex=m_nTotalSend%CheckBufLength;
    m_arBuf[iCurIndex]=0;
    pData->This=iCurIndex;
    pData->PackToBuf();

    CString strIP;
    in_addr tIP;
    tIP.S_un.S_addr=pData->tarIP;
    strIP=inet_ntoa(tIP);

    for(int i=0;i<m_nSendSocket&&times<FailReDoTimes&&!bSendSuccess;i++,i%=m_nSendSocket)
    if(!m_abBusy[i])
    {
    m_abBusy[i]=TRUE;

    DWORD tBegin=GetTickCount();
    m_apSendSocket[i]->SendTo(pData->szBuf,pData->num,pData->nPort,strIP);

    m_abBusy[i]=FALSE;

    while(!m_arBuf[iCurIndex]&&GetTickCount()-tBegin<m_nTimeOut);
    bSendSuccess=m_arBuf[iCurIndex];
    TRACE3("Send Data index:%d This:%d iCurI:%d\n",pData->index,pData->This,iCurIndex);
    times++;
    }

    return bSendSuccess;
    客户端
    char buff[DataBufLength];
    int nRead;
    CString sIP;
    UINT nPort;

    nRead = ReceiveFrom(buff,DataBufLength,sIP,nPort);

    if (nRead != SOCKET_ERROR && nRead != 0 )
    {
    //AfxMessageBox("sg");
    /*if(StrNSame(buff,m_szResponseMsg,nRead-4,m_szrLength))
    {
    DWORD Index=*((DWORD*)(buff+nRead-4));
    if(Index<=CheckBufLength)
    {
    m_arBuf[Index]=1;
    return;
    }
    }*/
    CString  sttr;
    sttr.Format("%d",nRead);
    AfxMessageBox(sttr);
    CData* pData=new CData;

    StrNCopy(pData->szBuf,buff,nRead);
    pData->num=nRead;
    pData->nPort=nPort;
    pData->tarIP=inet_addr(sIP);
    pData->LoadFromBuf();
    CString  sttt;
    sttt.Format("sgag%d\r\n%d\r\n%d",pData->index,pData->wIndex,pData->index);
    AfxMessageBox(sttt);
    if(pData->LoadFromBuf())
    {

    StrNCopy(m_szResponseMsg+m_szrLength,(char*)&pData->This,sizeof(DWORD));
    SendTo(m_szResponseMsg,m_szrLength+sizeof(DWORD),nPort,sIP);
    if(pData->wIndex>=0&&pData->wIndex<RecvWndNumber&&m_apRecvWnd[pData->wIndex]!=NULL)
    {
    m_apRecvWnd[pData->wIndex]->PostMessage(WM_RECIEVE_MSG,(WPARAM)pData,0);
    }
    TRACE2("Recv a Data index: %d This: %d\n",pData->index,pData->This);
    }
    }
    CAsyncSocket::OnReceive(nErrorCode);
      

  5.   

    客户端在接收到服务器端的信息后,在ReceiveFrom时,总是接受的比发送的少好多。除了端口正确,其余数据好像都不正确