这样一个设计:一个客户端,多个服务器端
客户端要和多个服务器分别建立连接并交互数据。
问题如下:
1。如何与多个服务器建立多个连接。
2。数据接收的时候如何确定是由那个服务器发来的数据。
谢谢指点,一定高分相送。

解决方案 »

  1.   

    一、为什么要与多个服务器端连接呢?如果是为了保证可靠性, 应该是屏蔽服务端,只对外提供一个接口,而服务端做IP转换等,我不知道你说的目的是什么?
    二、接收时的socket中可以取到源端啊
      

  2.   

    如果是tcp套接口那必须对每个服务器都建立一个套接口,每个套接口连接对应的一个服务器,问题1、2就很简单了。
    如果是udp套接口那只用一个套接口也可以,发送请求数据包,接受时用ReceiveFrom
    函数,就可以得到服务器的ip地址和端口了。
      

  3.   

    楼主和我正在做的东西差不多,但这块我也还没能解决。
    我也想知道如果同时有多个TCP连接请求时,客户端程序应该怎么做才能接收所有的TCP连接请求并接收数据。
    各位大侠多提建议,我学习:)
      

  4.   

    大家请关注http://expert.csdn.net/Expert/topic/1843/1843178.xml?temp=.7270929
      

  5.   

    用一个线程来轮询不同连接的多个SOCKET也是可以的,这样也能分辨数据来源;
    但是,这样做容易阻塞在某个SOCKET上,如果让每个SOCKET帮定在一个线程上,
    问题应该比较容易解决
      

  6.   

    最好用多线程,每个线程包含一个套接口。主线程维护一个子线程指针数组,动态创建子线程。
    子线程中套接口接收到消息的OnReceive函数只是将消息交给子线程处理,子线程再负责接收数据并将数据(连同服务器信息等等)通过消息通知主线程。
    主线程根据服务器信息处理即可。所以只需要派生一个套接口类就可:
    class CYourSocket::CAsyncSocket
    {
        CYourThread *m_pOwner;
        ...
        ... OnReceive(...) {... m_pOwner->OnReceive(...);};
    }最好自己找一个现成的例子跟踪执行一下。
      

  7.   

    regainworld,能给我一个现成的例子吗?
    [email protected]
    多谢!
      

  8.   

    无需这么麻烦,单线程即可。
    动态产生新Socket进行连接,同时在自己定义的Socket类中加入一个CString address记录此连接的对方的IP就行了。
    void CMySocket::OnAccept(int nErrorCode) //CMySocket是自己派生的Socket类
    {
    int len=sizeof(sockaddr_in);
    sockaddr_in *addr=new sockaddr_in;
    CMySocket *Connect=new CMySocket;
    Accept(*Connect,(sockaddr *)addr,&len);//用新生成的Socket连接,不影响侦听Socket
    address=inet_ntoa(addr->sin_addr);//得到对方的IP
    }
      

  9.   

    楼上说得是服务器端,监听端口接收连接的时候都得这么做,不过接收到后就可以选择开不开新线程了。不过标示数据来源的意思是对得。客户端你要主动连接服务器,所以你必须给线程传入服务器ip。
    class CYourThread::CWinThread
    {
        ... OnReceive(...) {};          //普通的成员函数,可以叫任何名字
       
        CYourSocket m_sock;    CString m_strServerIp;          //服务器ip
        HWND    m_hOwner;               //主窗口句柄,用来发送消息
        BOOL Init(CString strServerIp, HWND hOwner); //初始化成员变量
        
    }struct ReceiveDataInfo
    {
        int nReceived;
        CString strServerIp;
    };... CYourThread::OnReceive(...)
    {
        //接收数据
        ReceiveDataInfo rdi;
        char buf[MAX_SIZE];
        rdi.nReceived=m_sock.Receive(buf, MAX_SIZE);    //向主窗口发送接收到服务器数据
        rdi.strServerIp=m_strServerIp;
        ::SendMessage(m_hOwner, WM_XXX, buf, (LPARAM)&rdi);
    }现成例子我也没有,你问问别人吧:)
      

  10.   

    楼主,找到例子给我发一个好吗 ?
    我也在做这个方面,卡了~
    [email protected]
    谢了
      

  11.   

    建立一个服务器结构体
    struct server{
    CString IP;
    CString HostName;
    CMySocket * ClientSock;
    }serv[255];//具体多少个服务器随你定
    要连接时将客户端的Socket指针传到对印的server结构中去
    SOCKADDR_IN addr;
    int host;
    CMySocket *CSock=new CMySocket;
    if(CSock->Connect(ServerIP,ServerPort)!=SOCKET_ERROR)
    {    
        addr.Sin_addr=inet_addr(ServerIP);
        host=addr.sin_addr.S_un.S_un_b.s_b4;//用服务器IP地址的最后一个字节作为serv数组的编号(如果服务器IP地址最后一字节有重复则不可使用此法,但这种方法非常适合局域网,查找速度快)
        serv[host].ClientSock=CSock;
    }
    以后你就可以根据服务器的IP地址找到它在serv表中的位置,然后调用其中的ClientSock,进行传输操作
      

  12.   

    现在我也实现了,方法和ifromheaven(天堂鸟) 的基本类似,只是我用的是API。