socket通信问题 30
socket通信,当服务器端接收到若干个连接请求并accept新建若干数量的socket分别用来和不同的客户通信。这时候大量的客户端向服务器的同一端口发送信息(我觉得就是...
socket通信,当服务器端接收到若干个连接请求并accept新建若干数量的socket分别用来和不同的客户通信。这时候大量的客户端向服务器的同一端口发送信息(我觉得就是服务器端监听的端口),tcp层是如何把接收的数据准确的分配到各个不同的会话中的?很疑惑,请大神解答
或者说,服务器端在新建socket的时候是重新绑定了一个端口用于和客户端通信,同时向客户端发送更改端口的信息,这样客户端下次再和服务器通信时就使用新的端口(更改socket的端口值)。不知道我的猜测正不正确。如果真是这样的话,服务器端采用多线程,当大量连接到来时,服务器岂不是要有大量的端口被占用。 展开
或者说,服务器端在新建socket的时候是重新绑定了一个端口用于和客户端通信,同时向客户端发送更改端口的信息,这样客户端下次再和服务器通信时就使用新的端口(更改socket的端口值)。不知道我的猜测正不正确。如果真是这样的话,服务器端采用多线程,当大量连接到来时,服务器岂不是要有大量的端口被占用。 展开
2个回答
展开全部
亲,不知道该说你对,还是你错。
服务器程序在一个端口监听,这个端口我们暂称为监听端口,当该端口收到新的请求链接时,服务器会创建一个新的端口来与客户通信,accept函数 不知道你熟悉不,你可以去看看msdn accept返回的就是新的socket 也就是与客户通信的套接字.这个新套接字的端口是随机的,不会通知客户端,因为没有必要;
客户端调用connect函数后 会向服务器发送链接请求,当服务器accept收到后,就会创建端口与客户端继续交互,创建套接字的这个过程对客户端来说完全是透明的. 这个端口仅仅负责这个链接的通信,(这时候大量的客户端向服务器的同一端口发送信息)所以你说的是错误的,监听端口是负责监听,就说你发数据它也不会处理。所以不存在(把接收的数据准确的分配到各个不同的会话中的)
还有你说对了一点 每当有一个新的链接时 服务器的确会分配一个端口与客户端通信,这个通信的过程不再走监听端口,监听端口是负责监听,不负责通信(收发数据)。每当一个新链接就创建一个线程来处理通信的话,太浪费资源,你可以参考下io完成端口讲的很详细。
服务器程序在一个端口监听,这个端口我们暂称为监听端口,当该端口收到新的请求链接时,服务器会创建一个新的端口来与客户通信,accept函数 不知道你熟悉不,你可以去看看msdn accept返回的就是新的socket 也就是与客户通信的套接字.这个新套接字的端口是随机的,不会通知客户端,因为没有必要;
客户端调用connect函数后 会向服务器发送链接请求,当服务器accept收到后,就会创建端口与客户端继续交互,创建套接字的这个过程对客户端来说完全是透明的. 这个端口仅仅负责这个链接的通信,(这时候大量的客户端向服务器的同一端口发送信息)所以你说的是错误的,监听端口是负责监听,就说你发数据它也不会处理。所以不存在(把接收的数据准确的分配到各个不同的会话中的)
还有你说对了一点 每当有一个新的链接时 服务器的确会分配一个端口与客户端通信,这个通信的过程不再走监听端口,监听端口是负责监听,不负责通信(收发数据)。每当一个新链接就创建一个线程来处理通信的话,太浪费资源,你可以参考下io完成端口讲的很详细。
追问
你好,你说得很详细,可是如果 “当服务器accept收到后,就会创建端口与客户端继续交互,创建套接字的这个过程对客户端来说完全是透明的”。那么也就是客户端不会知道服务器创建了新的端口和自己通信,那么客户端在发送tcp报文段的时候,首部的目的端口字段肯定还得填写原来的(也就是服务器监听的那个端口),那数据不是还得发往服务器监听的端口,这不是自相矛盾了
展开全部
因为你每次accept接受的时候,会返回一个socket_desc也就是你的 描述符,而你每次接受消息 用recv 或者recvfrom等等的函数的时候里面调用的参数是有socket_desc 他会根据你的socket_desc来发送,接收的
如果是很多来通讯的话,最好使用多线程的方法来做服务器,来监听。
如果是很多来通讯的话,最好使用多线程的方法来做服务器,来监听。
追问
照这个解释,描述符只有服务器知道,客户端还是往原来的端口发送数据,而且tcp层首部只有源端口和目的端口的信息,无法区分数据是来自哪一个客户机,也就无法区分数据是来自哪一个客户端,这样的话数据是如何分发的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询