怎样把局域聊天程序成功移植为Internet聊天程序?  
       怎样把局域聊天程序成功移植为Internet聊天程序?  
       郁闷,我问了4次,都没满意的答案,谁能给我答案,最好是简短代码,实现原理即可。200分是你的。  
       很奇怪,我本来想放200分的,没成功,只能分两次给分了。  
       请别在此帖泛泛而谈,谢谢!

解决方案 »

  1.   

    局域网和internet的区别太大了,光防火墙就够忙的
      

  2.   

    通过交换机连接了一台路由,再就接入internet了。
      

  3.   

    我的思路是:
        用户登录是跟我们的服务器建立TCP连接,服务器获得连接者的IP和端口,再由服务器通知想要彼此通信的两个客户端,告诉他们彼此的IP和端口,最后两个客户用UDP互连,实现通信。
      

  4.   

    条件1:
    两个人不能都在子网内,既没有真实ip。
    条件2:
    你们可以通过某种方式获得有的那个真实ip。
    条件3:
    有真实ip的那里必须放服务器端。满足条件的话。。你的服务器端监听真实ip 的某个可用端口你的客户端就简单的改一下连接服务器的ip发粪涂墙--不好意思
      

  5.   

    主要问题还是在跨路由上面,由于地址映射的原因,公网IP和局域网内IP并不是一致的
      

  6.   

    我没有做过,但我想应该有两种情况:一种就是用户有真实ip,一种就是没有(即在局域网内)
    有真实ip的,你好办,没有真实ip的,你就得通过外部ip(真实ip)转到局域网内的ip了
      

  7.   

    not understand yet... attending...
      

  8.   

    我来说说吧。
    1、既然用UDP方式进行互通消息,那么服务器就不能只得到两个通话客户的TCP的映射地址和端口,还要得到UDP的映射地址和端口才行。
    2、服务器根据这个地址信息进行判断,如果双方都在公网就不用说了吧。
    3、如果某一方在公网,就告诉非公网的客户,对方的这个公网地址,非公网客户主动用UDP与公网客户发消息,公网客户根据收到数据时得到的地址信息向回发送数据包,这样就可以互通消息了。
    4、如果双方都在子网,有三种方法可以通讯:
       1〉服务器根据地址信息可以判断两个客户是否在同一子网,如果是,就跟局域网的方法一样了。
       2〉某一台子网内的电脑用静态映射的方法把自己的某一个端口映射到公网路由器的一个端口上,外部访问这个端口,就可以访问到这台电脑。
       3〉以上的方法都行不通的情况下,只能用服务器转发消息的方法了。
      

  9.   

    呵呵,实现没人讲,都是纸上谈兵阿
    好像用tcp作的移到internat上好办些
    据说udp的不太好搞
      

  10.   

    to bx2000:
    那你是知道怎样办了,将出来大家学习学习。
      

  11.   

    to swallowcomeback:
    看了你的回复,其实就是怎样获取彼此的真实IP(公网IP),原理应该正确,能给我代码看看吗?
    [email protected]
      

  12.   

    http://expert.csdn.net/Expert/FAQ/FAQ_Index.asp?id=174628
      

  13.   

    void CSetAddress::GetHostInfo(int NTF)
    {
    //以下代码是获取本地的相关信息,准备连接服务器
    Port=CtoD(nPort);  //获取端口号;
    if((m_strHostName=GetHostName())=="")
    {
    MessageBox("不能识别的主机名!");  //获取主机名称;
    return ;
    } //以下代码是获取ip信息部分
    LPHOSTENT hostinfo;
    hostinfo=gethostbyname(m_strHostName);
    if(!hostinfo)
    {
    MessageBox("连接失败:\n\t错误报告:不能识别本地主机!","错误!");
    return ;
    }
    else
    {
    struct in_addr addr[2];
    for(int i=0;hostinfo->h_addr_list[i]!=0;i++)
    {
    memcpy(&addr[i],hostinfo->h_addr_list[i],sizeof(in_addr));
    }
    switch(NTF)
    {
    case 1:
    if(CString(inet_ntoa(addr[1]))=="0.0.0.0")
    {
    MessageBox("请确认您已经安装了MODEM,并拨号上网!","连接失败!");
    return ;
    }
    else
    {
    m_strInetip=CString(inet_ntoa(addr[1]));
    break;
    }
    case 0:
    if(CString(inet_ntoa(addr[0]))=="0.0.0.0"||CString(inet_ntoa(addr[0]))=="")
    {
    MessageBox("请确认您已经安装了网卡,并已经配置好!","连接失败!");
    return ;
    }
    else
    {
    m_strLocalip=CString(inet_ntoa(addr[0]));
    break;
    }
    default:
    MessageBox("连接出错!","Error!");
    }
    }
    }
      

  14.   

    to kiluar:
    就需要你这样的好人,晚上我回去看看,明天结帖。
      

  15.   

    看看NAT方面的讨论,对你移植有帮助的。
    http://expert.csdn.net/Expert/topic/2657/2657890.xml?temp=.8711054
    不同局域网内的P2P通信。