最近正在学习vc网络编程用socket编了一个udp网络聊天程序
可是发现它只能进行局域网通信 和外网就朋友聊天就不行了怎样实现不同局域网之间的通信???模型如下:
user1-----------------LAN1---------------------Internet----------------------------------LAN2----user2就是如何用socket实现user1和user2之间的通信???大侠们请指教,小弟感激不尽!!!

解决方案 »

  1.   

    太好啦,楼主我也在学习socket呢,但我的服务器端为什么收不到客户端的信息呢,怎么回事,能帮我看一下吗?
    //UDP服务器端:
    #include <Winsock2.h>
    #include <stdio.h>void main()
    {
    WORD wVersionRequested;
    WSADATA wsaData;
    int err; wVersionRequested = MAKEWORD(1,1); err=WSAStartup(wVersionRequested,&wsaData);
    if (err!=0){
    return;
    } if (LOBYTE(wsaData.wVersion) !=1 ||
    HIBYTE(wsaData.wVersion) !=1){
    WSACleanup();
    return;
    } SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);
    SOCKADDR_IN addrSrv;
            addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
    addrSrv.sin_family=AF_INET;
    addrSrv.sin_port=htons(6000);
    bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); SOCKADDR_IN addrClient;
    int len=sizeof(SOCKADDR);
    char recvBuf[100]; recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
    printf("%s/n",recvBuf);
    closesocket(sockSrv);
    WSACleanup();
     

    }
    //UDP客户端:
    #include <Winsock2.h>
    #include <stdio.h>void main()
    {
    WORD wVersionRequested;
    WSADATA wsaData;
    int err; wVersionRequested = MAKEWORD(1,1); err=WSAStartup(wVersionRequested,&wsaData);
    if (err!=0){
    return;
    } if (LOBYTE(wsaData.wVersion) !=1 ||
    HIBYTE(wsaData.wVersion) !=1){
    WSACleanup();
    return;
    } SOCKET sockClient=(AF_INET,SOCK_DGRAM,0);
    SOCKADDR_IN addrSrv;
    addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
    addrSrv.sin_family=AF_INET;
    addrSrv.sin_port=htons(6000); sendto(sockClient,"Hellow",strlen("Hellow")+1,0,
    (SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
    closesocket(sockClient);
    WSACleanup();}
      

  2.   

    我最近转了一篇好文章,就是有关于你说的 UDP/TCP 穿透打洞的文章,到我空间去看看吧。
    似乎是需要一台服务端在互联网上作为中介的呢所以至少需要三台电脑,在网络实验室做这个实验比较好,用一个交换机和一个路由器及三台电脑。
    315539570.qzone.qq.com
    我也正在学习穿透socket 编程。
    欢迎一起讨论。
      

  3.   

    想实现跨局域网通信要通过一个公网上的服务器做中继
    QQ不也是有服务器的么
    也就是说你的服务器必须有公网IP
      

  4.   

    1.公网有一个服务器,你们都通过这台服务器通信
    2.你本身不是处于lan中,而是直接具有一个公网IP地址,此时对端通过IP可连接你
    3.一端通过路由器作DMZ映射到公网上,等于拥有了公网IP然后通信,此时对端通过公网IP能访问你
    4.打洞,前提是你在公网有一个服务器
    ...
      

  5.   

    谢谢啊 了解一点了
    服务器的话 网上那些免费的ftp空间可以算是服务器吗?
      

  6.   


    UDP协议通信,服务器端不需要监听,客户端也不需要连接,可以直接接受和发送数据。
      

  7.   

    也不一定非得打洞,如果你用的都是外网的IP当然都是可以的,之所以出现打洞,都是因为有内网IP,路由器不路由转发内网的数据包,关于打洞或穿透一说,楼主可以参考下p2p原理,网上很多
      

  8.   

    归根结蒂还是NAT的Session机制引起的问题,如果不租服务器,可以通过STUN服务器获得自己的公网入口
      

  9.   

    此问题还得从局域网上网的方式说起,分为通过代理和非代理的形式,通过打洞来实现非代理的形式很容易实现,而代理涉及到协议,有HTTP代理、SOCKS5代理等,具体连接需要和协议协商,这个实现本人正在做,要是有高手解决过,希望不吝赐教!