首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

请大家帮小弟我简单分析下下面的语句

2013-03-27 
请大家帮我简单分析下下面的语句。这个是P2P的例子SERVER端://20120602 支持两个客户端运行在同一个NAT后if

请大家帮我简单分析下下面的语句。
这个是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等,服务器端可以不用发这样的查询
[解决办法]
引用:
这个是P2P的例子
SERVER端:
C/C++ code


                        //20120602 支持两个客户端运行在同一个NAT后
                        if (sender.sin_addr.S_un.S_addr == remote.sin_addr.s_addr) {


                           ……


LZ说的这个问题是肯定存在的。那么只要先通一下进行测试,不行再进行TCP穿透或服务器中转。

热点排行