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

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

2012-09-22 
请大家帮我简单分析下下面的语句。这个是P2P的例子SERVER端:C/C++ code//20120602 支持两个客户端运行在同

请大家帮我简单分析下下面的语句。
这个是P2P的例子
SERVER端:

C/C++ code
                        //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这个命令。

以下是客户端代码:

C/C++ code
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。。代码太少了,看的不是很懂!!
[解决办法]
[code=C/C++][/code]
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) {
……

热点排行