问题描述:
我想创建一个socket的server端,同时接受多个client,然后与这几个client进行相互通信。
我的处理过程是这样的:
1,创建一个套接字:m_socket=WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,0);
2,绑定一个套接字:bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR));
3,注册网络事件:WSAAsyncSelect(m_socket,m_hWnd,UM_SOCK,FD_READ|FD_WRITE|FD_ACCEPT);
4,设置侦听和最大连接数:listen(m_socket,3);
5,接受连接:      if(socket!=0)
{
socket=accept(m_socket,NULL,NULL);
}
else if(socket1!=0)
{
socket1=accept(m_socket,NULL,NULL);
}这部分未做测试,不知道正确与否;
6,收发数据:
   关键问题,如何判断,读到的数据是哪个client发出的。
   单连接的话,我用的是:WSARecv(socket,&wsabuf,1,&dwRead,&dwFlag,NULL,NULL);
   要实现多连接的话,这部分该怎么处理?

解决方案 »

  1.   

    每个CLIENT connect成功后发出第一个包就包含自己的信息,每次SERVER bind到socket后先判断这个信息包再往后工作。
      

  2.   

    那可不可以在客户端登陆的时候,对客户端的IP地址进行保存~~
    然后每次对保存下来的IP地址通过它进行识别`~~~
      

  3.   

    现在的问题是:我不知道该用哪个socket去接受数据,如果我能读出数据来,解决起来没问题的
    不如,这个数据是socket发过来的,我用socket1去读,返回错误代码,只有用socket去读,才能获得它的数据。
      

  4.   

    我不知道该用哪个socket去接受数据,如果我能读出数据来,解决起来没问题的
    不如,这个数据是socket发过来的,我用socket1去读,返回错误代码,只有用socket去读,才能获得它的数据。
    我的意思是想说:你可以像QQ这样,当客户端请求登陆时,在和服务器端进行连接的时候,记录下它的登陆信息,用于以后区别是哪个socket,可以通过accept,来创建新的SOCKET用于接受请求,这个新的SOCKET主要是用于后来的数据的收发~~~
    你要做的工作是要将这些用于连接的SOCKET用多线程或者放到链表中~
    然后通过上面的登陆信息来判别~~~
      

  5.   

    对了,这个例子你看一下:
    http://www.codeproject.com/internet/barryschatsystem.asp
      

  6.   

    这样:在有SOCKET连入后,SERVER端可以先把SOCKET附加到STRUCTURE里,STRUCTURE要包含对方的头信息,然后把这个STRUCTURE记录在一个VECTOR里,一旦读到头信息数据就在VECTOR里找出是哪个SOCKET的,并记录下这些信息,这样,这个SOCKET不就有可认知的信息了吗。以后再有数据的就根据头信息判断咯。
      

  7.   

    5,接受连接:      if(socket!=0)
    {
    socket=accept(m_socket,NULL,NULL);
    }
    else if(socket1!=0)
    {
    socket1=accept(m_socket,NULL,NULL);
    }这部分未做测试,不知道正确与否;
    /////////////////////////////////////////////////
    if(socket1!=INVALID_SOKCET)
    {
    socket1=accept(m_socket,NULL,NULL);
    }
      

  8.   

    6,收发数据:
       关键问题,如何判断,读到的数据是哪个client发出的。
       单连接的话,我用的是:WSARecv(socket,&wsabuf,1,&dwRead,&dwFlag,NULL,NULL);
       要实现多连接的话,这部分该怎么处理?
    ////////////////////////////////////////////////
    保存客户端socket描述字具体参考www.vckbase.comWindows网络编程
      

  9.   

    nuaawenlin(飘人) ( ) :
    感谢你的指点,第一个bug,已经解决掉了,
    现在我把所有连接上来的client端地址,都保存下来了,但是,怎么运用到fd_read中去呢?
      

  10.   

    问题搞定,只要判断WSARecv(socket,&wsabuf,1,&dwRead,&dwFlag,NULL,NULL);返回是否为零,为零 则表示正确,