关于服务器对客户端的响应问题 一个类似QQ的小的聊天系统,服务器端口开放了三个,用外网和内网都做了测试,服务器端在接受客户端的登录请求时,内网的一个都登陆不上去,外网测试了5个人,只有两个能登陆上这是因为什么原因啊? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 登陆是该用TCP协议还是UDP协议呢??我用的是UDP协议啊 与具体的协议无关的无论是哪个协议都可以解决这类需要的你程序的错误码是什么,用GetLastError获得 UDP可能会丢包。要么,重试登陆,要么改用TCP. 我大体知道了错误的地方,但是不知道是何原因,我把代码贴出来,大家帮着看看,问题应该是出在客户端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&×<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); 客户端在接收到服务器端的信息后,在ReceiveFrom时,总是接受的比发送的少好多。除了端口正确,其余数据好像都不正确 关于在指定位置显示BMP图像问题 运行WORDPAD动态链接时出错,求解决! SetSystemPowerState()函数问题 VC中汉字打印的问题 标准C语言的函数,是不是在VC直接可以用,不用自己去引用头文件啊?? List历遍的问题 将一个文件名保存在一个字符串里,怎么将该文件名的主文件名和扩展名分离?(100分) 对话框窗口该怎么响应键盘事件呢? vs2008 中如何添加Webbrowser控件 mfc InstallShield中如何正确建立.bat文件的shortcut money类型的转换 关于堆内存和栈内存
无论是哪个协议都可以解决这类需要的
你程序的错误码是什么,用GetLastError获得
UDP可能会丢包。要么,重试登陆,要么改用TCP.
服务器端
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&×<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);