我有个疑问,就是客户端的SOCKET使用CONNECT的时候,服务器端的LISTEN SOCKET 的ONACCEPT后调用ACCEPT的时候,初始化那个SOCKET的时候做了哪些工作,那个对应的SOCKET会重新占用一个端口吗,如果不是,它会使用那个LISTEN socket来进行收发数据吗?我始终就不明白,本来是SOCKET接收到客户端的连接请求,它怎么能“转交”给另一个SOCKET,谢谢您解答了

解决方案 »

  1.   

    SERVER端监听的SOCKET一旦接收到连接请求后,就马上新建立一个SOCKET来连接,原来那个SOCKET继续监听,就这样!·
      

  2.   

    这个新建立的套接字由accept函数返回
    看函数原型就知道SOCKET accept(......)
      

  3.   

    SERVER端监听的SOCKET一旦接收到连接请求后,就马上新建立一个SOCKET来连接,原来那个SOCKET继续监听,就这样!
      

  4.   

    就是这样,监听一个连接后,就建立一个与此连接的SOCKET,原来的继续监听,若有连接,再建立一个,原来的还继续监听。就这样一个SERVER可以对应多个CLIENT。
      

  5.   

    这个问题你可以这么想:服务器就好像一家公司,客户端就好像是上门的顾客,Listen Socket就好像是公司的接待处,每当有顾客上门要求服务的时候,接待处的小姐就会把顾客交个相应的部门为其服务(由Accept函数返回的Socket),而接待处会去接待下一位顾客。接待处只负责接待顾客,顾客知道公司的接待处的位置(Listen Socket工作在知名端口),因此顾客只需要找到接待处,提出自己的服务要求就可以了。
      

  6.   

    初始化那个SOCKET的时候做了哪些工作:
    转交:
       具体不知道,估计象客户端connect之前做的工作类似吧
       accept:
           SOCKET a;
           a=socket;
           bind(a,...)
           类似connect的另一个内部函数将a与客户端socket连接起来
           return a;那个对应的SOCKET会重新占用一个端口吗:
       应该会使用非listen port外的另一个临时port
    收发数据:
       当然是用accept返回的SOCKET
    “转交”给另一个SOCKET:
        实际上是建立了一个SOCKET,客户端SOCKET是与新建的SOCKET连接在一起。
        这点在server端监测网络连接断开时可知:
            你并没有用listen socket监测断开,而是用accept返回的SOCKET监测.
      

  7.   

    在接收到连接请求后,生成新的SOCKET进行连接的时候
    并不会对这个新的SOCKET进行bind
      

  8.   

    在Unix下, socket 好像也是文件,只是有一点点特性的了,
    int SocketConnect = accept(socketRoot);
    accept 前,是socketRoot读写数据的了,
    accept 后,就变成SocketConnect 读写数据的,我随便说说的,错了别怪我的
      

  9.   

    感谢lj_csdn(大笨蛋),你是说服务端的对应的SOCKET会占用另一个临时的端口,但我还有些想法,我想LISTEN SOCKET接到连接请求后,会把客户端的IP及端口传给那个相应的SOCKET,再如你所说,会做类似客户端的工作,同客户端的SOCKET进行连接,但在这个过程中,应该有一些协议,比如说原来的客户端本来是连接到LISTEN SOCKET的,而服务器端的另一个端口会同客户端的这个端口来进行连接,这样,客户端的SOCKET的一部分参数会做一些改变,如SOCKADDR_IN 的sin_port 会是服务端那个SOCKET的端口了,否则客户端SEND的时候,会发错的,不知道我的想法对不对,这个过程的具体细节是什么
      

  10.   

    一个套接口表示一个TCP连接,它由四部分来标识,远端地址,远端端口,本地地址,本端端口,所以虽然是同样的本端地址和端口,但只要远端的地址或端口不同,就不是一个套接口。所以新ACCEPT后,并不会新开一个端口,你可以用“netstat -an” 试一下
      

  11.   

    继续问batizhou(batizhou)了:
    你说服务端对应的SOCKET不占用端口,那么它发送数据的时候,从哪里发,是通过LISTEN SOCKET吗,发送的数据中有那四个标识吗,另外客户端的SOCKET是应该有这四个标识的,那它的远端端口怎么写,还是LISTEN SOCKET的吗,如果是,那数据来了的时候应该首先是LISTEN SOCKET知道,那它如何把它“转交”给服务端另外一个对应的SOCKET,我的想法是,当LISTEN SOCKET ACCEPT后,转交给另外一个SOCKET的时候,客户端的SOCKET那四个标识会作一些变动,如远端的PORT
      

  12.   

    具体细节我也不知道。
    上述的另一个端口可能是错的。
    通过在connect后使用getpeername取对端连接数据看端口就是连接的端口。
    这样我就不明白一点:
       当server使用a port时
        1、客户端本身指定a port连接是失败的。
        2、两个客户端都指定b port连接后一个客户端是不能连接的,
           实际上都是在bind时就错了
    不过按batizhou(batizhou)说的倒是可以理解。“当LISTEN SOCKET ACCEPT后,转交给另外一个SOCKET的时候,客户端的SOCKET那四个标识会作一些变动,如远端的PORT“:
       按batizhou(batizhou)的说法,客户端的四个标识就不用变了:远端地址还是server IP,远端端口还是 server Port,本地自然不变了
    shuofa