请大家帮我简单分析下下面的语句。
这个是P2P的例子
SERVER端:
//20120602 支持两个客户端运行在同一个NAT后
if (sender.sin_addr.S_un.S_addr == remote.sin_addr.s_addr) {
stP2PMessage trans1;
trans1.iMessageType = P2PSAMENAT;
sendto(PrimaryUDP,(const char*)&trans1, sizeof(trans1), 0, (const sockaddr *)&sender, sizeof(sender));
stP2PMessage trans2;
trans2.iMessageType = P2PSAMENAT;
sendto(PrimaryUDP,(const char*)&trans2, sizeof(trans2), 0, (const sockaddr *)&remote, sizeof(remote));
printf("this is same nat\n");
break;
}
--我从以上看:如果两个IP外网地址相同,然后给两个内网用户发送P2PSAMENAT这个命令。
以下是客户端代码:
case P2PSAMENAT://20120602 发送内部IP来更新IP
{
printf("same nat, please send agian\n");
stMessage trans1;
trans1.iMessageType = P2PSAMENAT;
trans1.nIpAddress = ntohl(GetLocalIp());
strncpy(trans1.message.loginmember.userName, UserName, 10);
sendto(PrimaryUDP, (const char *)&trans1, sizeof(trans1), 0, (const sockaddr*)&remote, sizeof(remote));
bSameNatACK = true;
break;
}
//-------------------------------------------------
unsigned long GetLocalIp(void)
{
char szHostName[128];
if (gethostname(szHostName, 128) == 0)
{
struct hostent* pHost;
pHost = gethostbyname(szHostName);
in_addr tmp = *(struct in_addr *)pHost->h_addr_list[0];
return tmp.S_un.S_addr;
}
return 0;
}
//
我现在的问题是:
1:GetLocalIp这个函数应该是取到的内网IP地址吧?
2:源码的作者说:支持两个客户端运行在同一个NAT后,不知道各位能否看出他的具体处理思路是怎么样的?
我感觉是好像是外网IP相同,他的做法是采用内网IP进行通讯(但这方式对多级路由应该是有问题的)。
我是搞DELPHI的,对C++不清楚,请各位指教下:
http://topic.csdn.net/u/20120817/10/e0f6dc42-ec27-4822-8ef4-9f65d053b5b0.html
[解决办法]
1: 是的!
2:sender.sin_addr.S_un.S_addr == remote.sin_addr.s_addr 这个是判断两个客户端运行在同一个NAT后
[解决办法]
是内网IP,通过socket通信
若是扩域需要NAT穿透的好像
[解决办法]
内网通信直接UDP就可以了。。外网的话TCP这样保证数据正确性!!
sender.sin_addr.S_un.S_addr == remote.sin_addr.s_addr
这个只是更新IP,更新最新的一个IP。。代码太少了,看的不是很懂!!
[解决办法]
if()
{
}
else
{
}
[解决办法]
大概是这样的:
当服务器端检测到有不同客户端具有相同的的IP地址之后,就依次向涉及到的连接发送询问消息,各相关客户端收到询问消息后,就把自己的私有IP地址发消息报给服务器
[解决办法]
内网与公网之间的通信由NAT解决了,通信对客户机和服务器端都是透明的,只是服务器端收到的数据包都是NAT网关的地址,所以要发一条询问消息来获取客户端的私有地址来区分客户端,如果用户数据包直接中包含有客户端的识别信息,如本地IP或ID等,服务器端可以不用发这样的查询
[解决办法]
LZ说的这个问题是肯定存在的。那么只要先通一下进行测试,不行再进行TCP穿透或服务器中转。