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 不可用的异常!!开始我以为是服务每启动,我看机器服务,也启动了!!始终不知道是怎么回事?箐高手指点,出错在哪里??谢谢!

解决方案 »

  1.   

    你可能理解错误,不是消息,是UDP发数据包1!!
      

  2.   

    你的应用是不是客户端发送数据到服务器后等待服务器回复?
    如果是这样,由于你选择了不可靠的UDP协议,期间只要有一次丢包,这个流程就会出现客户端等待服务器的回复,服务器等待客户端的请求的僵死状态。
    解决方案:1、使用TCP;2、基于UDP增加重传机制
      

  3.   

    你说的有道理,但是RPC不可用异常,是怎么回事呢?是不是代码上还是有问题?
      

  4.   

    用抓包工具Ethereal抓包看下,数据是否发了出去,接收到没有。