bool
TestPortFromPort(StunAddress4 serverAddr,USHORT *pPortMin, USHORT *pPortMax)
{
SOCKET clientSock = openPort(CLIENT_PORT, ntohl(GetLocalAddr()), false);
if(clientSock == INVALID_SOCKET)
{
return false;
}
TestPacket Packet;
ZeroMemory(&Packet, sizeof(Packet));
char szBuffer[MAX_MSG_LEN] = {0};
int nMsgLen = MAX_MSG_LEN;
bool bOk(false);
Packet.hdr.Type = Request_Port;
BuildPacket(Request_Port, NULL, Packet);
EncodePacket(Packet, szBuffer);
StunAddress4 from;
bOk = sendMessage(clientSock, szBuffer, MAX_MSG_LEN, serverAddr.addr, serverAddr.port, false);
if(!bOk)
{
DoOnError(SendMsgError);
return false;
}
ZeroMemory(szBuffer, sizeof(szBuffer));
bOk = getMessage(clientSock, szBuffer, &nMsgLen, &from.addr, &from.port, false);
if(!bOk)
{
DoOnError(RecvMessageError);
return false;
}
ZeroMemory(&Packet, sizeof(Packet));
ParsePacket(szBuffer, Packet);
if(Packet.hdr.Type != Request_Port)
{
fs << "msg type miss" <<endl;
return false;
}
TestPacket sendPacket;
ZeroMemory(&sendPacket, sizeof(sendPacket));
char szSendBuffer[MAX_MSG_LEN] = {0};
USHORT uPortArr[Test_Port_Num] = {0};
fs << "************************"<<endl;
//以下这些是出问题的代码:sendMessage ,getMessage
for(int i = 0; i < Test_Port_Num; i++)
{
BuildPacket(Request_Communicate, NULL, sendPacket);
EncodePacket(sendPacket, szSendBuffer);
bOk = sendMessage(clientSock, szSendBuffer, MAX_MSG_LEN, serverAddr.addr, Packet.pd.uPort[i], false);
if(!bOk)
{
DoOnError(SendMsgError);
return false;
}
ZeroMemory(szBuffer, sizeof(szBuffer));
bOk = getMessage(clientSock, szBuffer, &nMsgLen, &from.addr, &from.port, false);
if(!bOk)
{
DoOnError(RecvMessageError);
return false;
}
ParsePacket(szBuffer, sendPacket);
uPortArr[i] = sendPacket.ad.uPort;
fs <<"port : "<<sendPacket.ad.uPort<<endl;
ZeroMemory(&sendPacket, sizeof(sendPacket));
}
fs << "******************************************"<<endl;
FindMinMax(uPortArr, Test_Port_Num, pPortMin, pPortMax);
closesocket(clientSock);
return true;
}上面这个函数是我客户端调用的函数,当调用次数曾多之后,就会出现getMessage这个函数就收不到服务器发送的数据了,我在服务器端也发现,当客户端多发几次之后,服务器就收不到客户端的数据了,我在客户端调试的时候也发现:在输出端口,出现RPC 不可用的异常!!开始我以为是服务每启动,我看机器服务,也启动了!!始终不知道是怎么回事?箐高手指点,出错在哪里??谢谢!
TestPortFromPort(StunAddress4 serverAddr,USHORT *pPortMin, USHORT *pPortMax)
{
SOCKET clientSock = openPort(CLIENT_PORT, ntohl(GetLocalAddr()), false);
if(clientSock == INVALID_SOCKET)
{
return false;
}
TestPacket Packet;
ZeroMemory(&Packet, sizeof(Packet));
char szBuffer[MAX_MSG_LEN] = {0};
int nMsgLen = MAX_MSG_LEN;
bool bOk(false);
Packet.hdr.Type = Request_Port;
BuildPacket(Request_Port, NULL, Packet);
EncodePacket(Packet, szBuffer);
StunAddress4 from;
bOk = sendMessage(clientSock, szBuffer, MAX_MSG_LEN, serverAddr.addr, serverAddr.port, false);
if(!bOk)
{
DoOnError(SendMsgError);
return false;
}
ZeroMemory(szBuffer, sizeof(szBuffer));
bOk = getMessage(clientSock, szBuffer, &nMsgLen, &from.addr, &from.port, false);
if(!bOk)
{
DoOnError(RecvMessageError);
return false;
}
ZeroMemory(&Packet, sizeof(Packet));
ParsePacket(szBuffer, Packet);
if(Packet.hdr.Type != Request_Port)
{
fs << "msg type miss" <<endl;
return false;
}
TestPacket sendPacket;
ZeroMemory(&sendPacket, sizeof(sendPacket));
char szSendBuffer[MAX_MSG_LEN] = {0};
USHORT uPortArr[Test_Port_Num] = {0};
fs << "************************"<<endl;
//以下这些是出问题的代码:sendMessage ,getMessage
for(int i = 0; i < Test_Port_Num; i++)
{
BuildPacket(Request_Communicate, NULL, sendPacket);
EncodePacket(sendPacket, szSendBuffer);
bOk = sendMessage(clientSock, szSendBuffer, MAX_MSG_LEN, serverAddr.addr, Packet.pd.uPort[i], false);
if(!bOk)
{
DoOnError(SendMsgError);
return false;
}
ZeroMemory(szBuffer, sizeof(szBuffer));
bOk = getMessage(clientSock, szBuffer, &nMsgLen, &from.addr, &from.port, false);
if(!bOk)
{
DoOnError(RecvMessageError);
return false;
}
ParsePacket(szBuffer, sendPacket);
uPortArr[i] = sendPacket.ad.uPort;
fs <<"port : "<<sendPacket.ad.uPort<<endl;
ZeroMemory(&sendPacket, sizeof(sendPacket));
}
fs << "******************************************"<<endl;
FindMinMax(uPortArr, Test_Port_Num, pPortMin, pPortMax);
closesocket(clientSock);
return true;
}上面这个函数是我客户端调用的函数,当调用次数曾多之后,就会出现getMessage这个函数就收不到服务器发送的数据了,我在服务器端也发现,当客户端多发几次之后,服务器就收不到客户端的数据了,我在客户端调试的时候也发现:在输出端口,出现RPC 不可用的异常!!开始我以为是服务每启动,我看机器服务,也启动了!!始终不知道是怎么回事?箐高手指点,出错在哪里??谢谢!
解决方案 »
- 小球从客服区移动到屏幕上没办法吗(有痕迹问题...)//
- CreateFile在磁盘根目录下创建文件失败,但在子目录下就没问题
- 文件保存问题!
- 如何让程序已运行窗口就最大化?
- 《Inside OLE2》谁有电子版的请发给我,或指条明路,散分...
- 请问在vc中将CPU控制权交出的涵数叫什么?相当于VB中的DoEvents()
- 数组里的上千个double型的数据怎样正确保存为*.txt文件并读出到数组里?
- idl中的属性关键字restricted到底是怎么用的?msdn解释没看懂
- 希望各位大虾能帮忙推荐一本学习COM的教材....
- 怎样从CObject类派生出一个类?
- 关于通信和提示的问题
- mfc CSocket类
如果是这样,由于你选择了不可靠的UDP协议,期间只要有一次丢包,这个流程就会出现客户端等待服务器的回复,服务器等待客户端的请求的僵死状态。
解决方案:1、使用TCP;2、基于UDP增加重传机制