用socket不论你是几个局域网都可以的。

解决方案 »

  1.   

    1.建立应用程序框架   为了便于说明程序之间的相互关系,假设已用VC ++的AppWizard建立了单文档类型的应用程序框架,项目名为Asock,它包括以下几个文件:   AsockApp.h AsockApp.cpp   MainFraim.h MainFraim.cpp   ChildView.h ChildView.cpp   下面在上述程序框架的基础上编写一个能进行异步通信的应用程序。   2.流式套接字通信原理   流式套接字因其可靠性高而得到广泛的应用。其通信原理为:服务端和客户端都必须建立通信套接字,而且服务端应先进入监听状态,然后客户端套接字发出连接请求,服务端收到请求后,建立另一个套接字进行通信,原来负责监听的套接字仍进行监听,如果有其他客户发来连接请求,则再建立一个套接字。默认状态下最多可同时接收5个客户的连接请求,并建立通信关系。   3.定义MySocket类   本例中为了实现套接字的网络异步通信,通过异步套接字类CAsycnSocket派生出两个新类。代码的生成可以利用ClassWizard来建立程序框架,给两个派生类取名为MySocket和ServeSocket,生成时使用的基类为CAsycnSocket,并可将它们放在同一组文件中(本例是放在MySocket.h和MySocket.cpp中)。接着在ClassWizard中为MySocket类加入OnAccept()和OnReceive()两个函数;为ServeSocket类加入OnReceive()函数。注意,这些函数都是重载函数,不能随便给其命名,加入函数的方法是:在ClassWizard的Object Ids窗口中选中最后一行,然后在Message窗口中选择相应的函数即可。   两个派生类的功能是:MySocket类用于在服务端和客户端建立套接字,分别用于监听和通信;ServeSocket类用于在服务端建立通信套接字,它是在服务端监听到连接请求后才建立的,因此本例中将它作为MySocket类的成员变量。为了使服务端能响应多个客户的请求,可以建立5个ServeSocket类型的套接字,并设立一个记录器,记录已经收到的请求个数,该记录器在MySocket的构造函数中被置为0。   完成异步通信的关键在于上述三个重载函数,它们从网络中传来信息时,可以被自动调用,以完成接收工作。在本例中,OnAccept()函数在收到连接请求后,会向客户发出一个代表其序号的信息;两个OnReceive()函数都进行提示,并在确认后将收到的信息发送回去。上述两个派生类的源代码在网上,网址为www.pccomputing.com.cn。   4.完成服务端或客户端的设置   通过菜单项完成的设置工作可以有多种安排方法,本例为了便于显示,将设置工作安排在CChildView类中。首先用资源编辑器在主菜单中增加Server和Client两个选项,并定义它们的ID,然后用ClassWizard在CChildView类中增加对这两个ID的响应函数,并在其中分别创建套接字后进入监听或开始连接。为了便于观察工作进程,可在其中增加相应的输出语句,另外,在ChildView.h和ChildView.cpp文件前面必须有#include "mysocket.h"语句。   为了简化程序,本程序直接写入服务主机的IP地址,因此,本程序在使用时,服务端是指定的,不能随便改变,但客户端的位置不受限制。   5.程序的使用   本程序可以在同一网络中的不同主机之间进行异步通信。以两台主机为例,首先在指定的主机上启动本程序,并在菜单中选择Server选项,使程序进入监听状态;然后在另一主机上启动本程序并选择Client选项,向服务端发出连接请求;服务端收到连接请求后,自动调用OnAccept()函数,根据客户端的请求顺序向其发出相应信息;客户端接收到服务端发出的信息后,在屏幕上显示一个提示框,按下“确认”按钮后,客户端将此信息发回服务端;服务端收到客户端发回的信息后,处理方式与客户端相同,就是这样实现了这个信息在两台计算机之间的来回传递。值得注意的是,在等待信息期间,这个程序还可以做其他的工作,比如可以选择菜单上的某个选项等,当然也可以加入其他的工作。   运行本程序并选择作为服务端时最多可以同时接收五个客户的请求,因此可以同时运行本程序的六个实例,其中一个设置为服务端,另外五个设置为客户端。由于服务端实际上是用五个套接字分别与客户端通信,因此点对点的通信过程将会互不干扰地进行。   6.源程序   本文给出框架中被改动过的文件代码(即MySocket和ChildView的.h和.cpp文件的源代码)如下,这些程序均在VC ++ 6.0下编译通过,并在本文作者单位的网络环境上运行成功。   mysocket.h文件:   //派生套接字类   class ServeSocket : public CAsyncSocket   {public:    char rx_buf[100];    int ServeNo;   public:    ServeSocket();    virtual ~ServeSocket();   public:    // ClassWizard generated virtual function overrides    //{{AFX_VIRTUAL(ServeSocket)    public:    virtual void OnReceive(int nErrorCode);    //}}AFX_VIRTUAL   }      class MySocket : public CAsyncSocket   {   public:    ServeSocket servesocket[5];    int AcceptNo;    int ConnectNo;    char rx_buf[100];   public:    MySocket();    virtual ~MySocket();   public:    // ClassWizard generated virtual function overrides    //{{AFX_VIRTUAL(MySocket)   public:    virtual void OnAccept(int nErrorCode); 
     
       virtual void OnReceive(int nErrorCode);    //}}AFX_VIRTUAL   }      mysocket.cpp文件中的有关部分:   void ServeSocket::OnReceive(int nErrorCode)   {    if(Receive(rx_buf,100))    {//重新发出收到的信息    MessageBeep(0);    AfxMessageBox(rx_buf);    Send(rx_buf,10);    }    else    {//接收错误    AfxMessageBox("receive failed",14);    return;    }    CAsyncSocket::OnReceive(nErrorCode);   }      void MySocket::OnAccept(int nErrorCode)   {    if(AcceptNo>4) return;    if(!Accept(servesocket[AcceptNo]))    {//接收请求失败    AfxMessageBox("accept fail!",12);    }    else    {//接收请求成功    servesocket[AcceptNo].ServeNo=AcceptNo;    switch(AcceptNo)    {//根据接收次序,向客户端发出信息    case 0:    {servesocket[AcceptNo].Send("Message 0",10);break;}    case 1:    {servesocket[AcceptNo].Send("Message 1",10);break;}    case 2:    {servesocket[AcceptNo].Send("Message 2",10);break;}    case 3:    {servesocket[AcceptNo].Send("Message 3",10);break;}    case 4:    {servesocket[AcceptNo].Send("Message 4",10);break;}    default:    break;    }   // AfxMessageBox("accept client!",14);    AcceptNo++;    }    CAsyncSocket::OnAccept(nErrorCode);   }      void MySocket::OnReceive(int nErrorCode)   {    if(Receive(rx_buf,100))    {//将收到的信息重新发出    MessageBeep(0);    AfxMessageBox(rx_buf);    Send(rx_buf,10);    }    else    {//接收错误    AfxMessageBox("receive failed",14);    return;    }    CAsyncSocket::OnReceive(nErrorCode);   }      3.childview.h文件中的有关部分   class CChildView : public CWnd   {   ...public: MySocket Socket_id;    //定义套接字类...protected:    //{{AFX_MSG(CChildView)}    afx_msg void OnPaint();    afx_msg void OnClient();    afx_msg void OnServer();    //}}AFX_MSG DECLARE_MESSAGE_MAP()   }      4.childview.cpp文件中的有关部分   BEGIN_MESSAGE_MAP(CChildView,CWnd )    //{{AFX_MSG_MAP(CChildView) ON_WM_PAINT()    ON_COMMAND(ID_CLIENT, OnClient)    //菜单项ID_CLIENT将程序设置为客户端 ON_COMMAND(ID_SERVER, OnServer)    //菜单项ID_CLIENT将程序设置为服务端 //}}AFX_MSG_MAP   END_MESSAGE_MAP()      void CChildView::OnClient()   {    CClientDC dc(this);    //Creat a socket    Socket_id.Create();    dc.TextOut(200,100,"connect",7);    if(Socket_id.Connect("192.0.0.0",2000))    //服务端主机IP地址和端口号    dc.TextOut(200,120,"connect fail!",13);    else    dc.TextOut(200,120,"connect successful!",18);   }      void CChildView::OnServer()   {    CClientDC dc(this);    //创建已定义的套接字    Socket_id.Create(2000);    //为其分配一个端口(2000)    //Socket_id.Bind(2000,"192.0.0.0");    //端口号和服务端主机IP地址。不同的主机此地址不同。    //开始监听    dc.TextOut(200,100,"listen",6);    Socket_id.Listen();   } 
      

  2.   

    建立soket通讯
    先实例化一个WinSocket对象
    msdn里面有例子和说明,看仔细点
      

  3.   

    我也比较感兴趣!以前在两个局域网内部直接用sock确实没有实验成功!
      

  4.   

    to: wxcwwx(wwxmmx) 
        你能否说清楚些?谢谢!
      

  5.   

    在两个LAN网内的SOCKET端口是不能直接通讯的,需要一个第三者的"连接".对于使用NAT(网络地址转换)的小型网络,内部端口和地址对外是不可见的,就是说两个局域网内的主机互相"看不到",这时候需要采用第三方的方法,就是提供一个固定的IP,其上运行程序帮助两个内网的主机相连接.才可!!
      

  6.   

    你能否ping通对方的机器?能ping的通就可以。
      

  7.   

    关注!在2个不同的LAN之间通信应该不是这么简单的
      

  8.   

    thanks, joners(陈冰)
    那如果一个 mode上网,一个是局域网内,有何方法呢?
      

  9.   

    To:joners(陈冰) 
        你的解释让我明白了许多。thanks,very much!过后一定给你分!但现在我想再听听是否还有更好的想法。