我的服务端socket同时监听多个客户端socket1,socket2,----,建立连接后客户端就开始向服务端发送数据,同时服务端也可以更改命令参数,然后发送给客户端。
我的问题是1、怎么判断是那个客户端和服务端建立了连接?
          2、服务端要发送给第一个客户端,那怎么判断是发送给了第一个客户端?
是不是每个客户端都要建立一个什么标志,然后先发送这个标志呢?
                                  

解决方案 »

  1.   

    你看一看5种网络模型 , 用户不多的话(64以下), 建议用 WSASelect  ,  用户过千, 用 IOCP
      

  2.   

    TCP是可靠,面向连接的传输层协议
    listen, 然后accpt的时候,socket其实已经包含了本地IP,端口,远程IP和端口
    accept在参数中返回远程IP,端口accept FunctionThe accept function permits an incoming connection attempt on a socket.
    SOCKET accept(
      __in          SOCKET s,
      __out         struct sockaddr* addr,
      __in_out      int* addrlen
    );Parameters

    A descriptor that identifies a socket that has been placed in a listening state with the listen function. The connection is actually made with the socket that is returned by accept.addr 
    An optional pointer to a buffer that receives the address of the connecting entity, as known to the communications layer. The exact format of the addr parameter is determined by the address family that was established when the socket from the sockaddr structure was created.addrlen 
    An optional pointer to an integer that contains the length of structure pointed to by the addr parameter.
      

  3.   

    IPCP可不是好玩的,搞不好会吐血的。
      

  4.   

    想向你讨教一下,accept的参数s 已经绑定了本地IP,port,
    那参数addr 是用来保存远程Ip和port的,accept成功之后就可以在addr中得到远程的IP,PORT,是不是这样?
      

  5.   

    如果我要判断服务端与哪个客户端建立了连接,只要用accept返回的addr这个参数即可,是这样吗?
      

  6.   

    是的,accept会在addr返回客户端IP和端口,插口对对应了这个socket
      

  7.   

    那Accpet函数的返回值也是客户端的ip和port啊?这样功能重复了啊?一般都是这样调用的啊?
    stcpactive = accept( stcp, (struct sockaddr*)&sin1, (int*)&size );
    cnt = recv( stcpactive, (char*)&channelID+i, 4-i, 0 );
    没有这样用吧
    cnt = recv( sin1, (char*)&channelID+i, 4-i, 0 );
      

  8.   


    socket和sockaddr不同TCP/IP中sockaddr是如下结构
    struct sockaddr_in {
            short   sin_family;
            u_short sin_port;
            struct  in_addr sin_addr;
            char    sin_zero[8];
    };然后使用以下方法将,sin_addr转为字符串
    char* FAR inet_ntoa(
      __in          struct   in_addr in
    );
      

  9.   


    这样就可以,socket只是个抽象的概念,sockaddr里才存放真正的有用信息.