socket通信问题 30

socket通信,当服务器端接收到若干个连接请求并accept新建若干数量的socket分别用来和不同的客户通信。这时候大量的客户端向服务器的同一端口发送信息(我觉得就是... socket通信,当服务器端接收到若干个连接请求并accept新建若干数量的socket分别用来和不同的客户通信。这时候大量的客户端向服务器的同一端口发送信息(我觉得就是服务器端监听的端口),tcp层是如何把接收的数据准确的分配到各个不同的会话中的?很疑惑,请大神解答
或者说,服务器端在新建socket的时候是重新绑定了一个端口用于和客户端通信,同时向客户端发送更改端口的信息,这样客户端下次再和服务器通信时就使用新的端口(更改socket的端口值)。不知道我的猜测正不正确。如果真是这样的话,服务器端采用多线程,当大量连接到来时,服务器岂不是要有大量的端口被占用。
展开
 我来答
冰太挽大宝13
推荐于2016-07-13 · 超过26用户采纳过TA的回答
知道答主
回答量:66
采纳率:0%
帮助的人:28.9万
展开全部
亲,不知道该说你对,还是你错。

服务器程序在一个端口监听,这个端口我们暂称为监听端口,当该端口收到新的请求链接时,服务器会创建一个新的端口来与客户通信,accept函数 不知道你熟悉不,你可以去看看msdn accept返回的就是新的socket 也就是与客户通信的套接字.这个新套接字的端口是随机的,不会通知客户端,因为没有必要;

客户端调用connect函数后 会向服务器发送链接请求,当服务器accept收到后,就会创建端口与客户端继续交互,创建套接字的这个过程对客户端来说完全是透明的. 这个端口仅仅负责这个链接的通信,(这时候大量的客户端向服务器的同一端口发送信息)所以你说的是错误的,监听端口是负责监听,就说你发数据它也不会处理。所以不存在(把接收的数据准确的分配到各个不同的会话中的)

还有你说对了一点 每当有一个新的链接时 服务器的确会分配一个端口与客户端通信,这个通信的过程不再走监听端口,监听端口是负责监听,不负责通信(收发数据)。每当一个新链接就创建一个线程来处理通信的话,太浪费资源,你可以参考下io完成端口讲的很详细。
追问
你好,你说得很详细,可是如果 “当服务器accept收到后,就会创建端口与客户端继续交互,创建套接字的这个过程对客户端来说完全是透明的”。那么也就是客户端不会知道服务器创建了新的端口和自己通信,那么客户端在发送tcp报文段的时候,首部的目的端口字段肯定还得填写原来的(也就是服务器监听的那个端口),那数据不是还得发往服务器监听的端口,这不是自相矛盾了
小靖锅锅
2013-09-05 · 超过60用户采纳过TA的回答
知道小有建树答主
回答量:203
采纳率:0%
帮助的人:132万
展开全部
因为你每次accept接受的时候,会返回一个socket_desc也就是你的 描述符,而你每次接受消息 用recv 或者recvfrom等等的函数的时候里面调用的参数是有socket_desc 他会根据你的socket_desc来发送,接收的
如果是很多来通讯的话,最好使用多线程的方法来做服务器,来监听。
追问
照这个解释,描述符只有服务器知道,客户端还是往原来的端口发送数据,而且tcp层首部只有源端口和目的端口的信息,无法区分数据是来自哪一个客户机,也就无法区分数据是来自哪一个客户端,这样的话数据是如何分发的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式