我mfc写一个聊天程序,在服务器端监听的端口是6000,但客户端有连接过来是进入OnAccept()
在OnAccept中调用了Accept函数,生成一个新的Socket,那么我想这个新的socket应该有新的端口了(是吗?),但是我用GetSockName(),查看了一下,端口竟然是6000,我同时连了好几个客户端,Accept()后新的Socket的端口都是6000,能不能给个解释?我想应该是每个不同的连接都有不同的端口号啊,而且应该和监听端口不一样啊,请赐教!

解决方案 »

  1.   

    当然,因为你的监听端口是 6000,所有的socket都会连接到这个端口来,然后由系统来处理各个socket的I/O难道处理上万的客户端的时候就要打开上万的端口吗?:)
      

  2.   

    to PiggyXP(【小猪】●钟爱VC,钟爱网络版●) :
    在OnAccept中我的代码如下
    m_ListenSocket.Accept(m_SendSocket);//其中m_SendSocket是和请求连接通信的
    m_SendSocket.GetSockName(tempIP,tempPort);//执行后tempPort的值是6000
    那么m_SendSocket应该是新的Socket,怎么会和监听Socket一个端口呢?
    监听和数据传送都是6000?
      

  3.   

    顺便再问个问题,我在做聊天程序,在客户端发送到其他客户端的消息都是经过服务器中转的
    那么假设有两个客户ClientA,ClientB,两个在服务器端负责与其通信的Socket是ServerA,ServerB
    但ClientA想给ClientB发消息,那么ClientA先发送到ServerA,当ServerA接受到数据时,怎么送到ClientB呢,是ServerA直接发送数据到ServerB呢,还是直接到ClientB?
      

  4.   

    先说第一个问题,server监听哪个端口,所以的连接就会用这个端口。他会区分的。至于底层的原理我就不知道了。第二问题。主要看你的聊天程序是什么类型的了。如果是用长连接的话,那当serverA收到后,直接用serverB发到clientB.如果是短连接,那么clientB应该定时刷新并发出命令从serverA获取属于自己的信息。 比如你的client可能会是浏览器。这主要还看你的client 与 server 之间采用什么样的连接方法。
      

  5.   

    去看《网际互连TCP/IP协议》吧,
    对于监听状态的socket, 每个TCP|UDP端口只能有一个。
    对于连接状态的socket,每个TCP端口可以有N个,但是每个
    【本端地址:端口——对端地址:端口】这样的地址对却只能有一个,
    因为系统底层是根据它来区分socket数据的。
      

  6.   

    我是tcp连接的,我就是想问Accept()后的新的用来传输数据的Socket的端口号是系统随机的,是和监听端口一样,还是没有?
    我用GetNameSocket得到的是和监听端口一样?
    但是我想应该是一个新的端口!
    谁给我一个明确的回答,谢谢!
      

  7.   

    谁给我一个明确的回答,谢谢!=============================================================   明确回答:accept以后创建的socket还是用的监听端口 6000,多个socket通过一个端口来通信是很正常的事情:)    服务器段是可以通过一个端口来管理多个会话的