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

请大家帮我简单分析下下面的语句。
这个是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) {
……