免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3602 | 回复: 10
打印 上一主题 下一主题

[网络] 问个tcp客户端的问题~~ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-07-14 22:17 |只看该作者 |倒序浏览
请问下各位大神~~,客户端现在已经有了个 已连接 的套接字文件描述符 fd,然后客户端不断从消息队列取请求包通过这个fd发给服务器(请求包得和响应包一一对应),然后服务器返回响应。现在,服务器的响应都返回到了这个fd的内核接受缓冲区里,请问,我要怎么区分这个fd的内核接受缓冲区的响应数据分别对应哪个请求包呢??

论坛徽章:
0
2 [报告]
发表于 2014-07-14 22:46 |只看该作者
顶顶大神们过来回答啊!!~~

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
3 [报告]
发表于 2014-07-15 08:55 |只看该作者
请求包里面你放一个唯一标识,然后要求服务器在应答包里面原样返回这个标识

论坛徽章:
0
4 [报告]
发表于 2014-07-15 16:54 |只看该作者
现在的问题是,我的套接字文件描述符是非阻塞的,用select对其进行监听,这样的话,只要有数据到达fd的接受缓冲区,就会引发读操作,哪怕只有一个字节的数据。这样的话会存在一个问题,如果消息一对应的响应一的部分数据,和 消息二对应的响应二的部分数据一起到达fd的接受缓冲区,那么对fd读的话,不是把响应一和响应二的部分数据混在一起读出来了吗?我想问的是,如何避免这个问题?回复 3# hellioncu


   

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
5 [报告]
发表于 2014-07-15 16:57 |只看该作者
lzyshijune 发表于 2014-07-15 16:54
现在的问题是,我的套接字文件描述符是非阻塞的,用select对其进行监听,这样的话,只要有数据到达fd的接受 ...


增加包头,里面放上长度信息,然后自己拆分

论坛徽章:
0
6 [报告]
发表于 2014-07-15 17:18 |只看该作者
问题是,不同消息的数据混在了fd的接受缓冲区怎么办,这样即使知道响应长度,也会读到其他消息的数据啊,TCP不是分组传输的吗?
这样我想问另一个问题,如果响应一的部分数据到达客户端,那么linux内核是会等待响应一的所有数据到齐以后,重新组装成原来的样子才把响应一放到内核缓冲区并提示fd可读呢?还是响应一的部分数据到达客户端以后,立马将其放到内核缓冲区并提示fd可读?

回复 5# hellioncu


   

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
7 [报告]
发表于 2014-07-15 17:23 |只看该作者
lzyshijune 发表于 2014-07-15 17:18
问题是,不同消息的数据混在了fd的接受缓冲区怎么办,这样即使知道响应长度,也会读到其他消息的数据啊,TC ...


TCP会保证数据的次序

论坛徽章:
0
8 [报告]
发表于 2014-07-15 17:35 |只看该作者
谢谢你这么耐心,但是我还会想确认下,如果一个消息被分成3部分发到客户端,linux系统(客户端)先收到第一部分,这个时候客户端linux系统就会提示fd可读呢?还是等linux完整收到3个部分的消息后,才会提示客户端fd可读??
回复 7# hellioncu


   

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
9 [报告]
发表于 2014-07-15 20:36 |只看该作者
lzyshijune 发表于 2014-07-15 17:35
谢谢你这么耐心,但是我还会想确认下,如果一个消息被分成3部分发到客户端,linux系统(客户端)先收到第一 ...


收到一部分就会提示可读。实际上服务端分成几部分发送跟客户端分成几次收到没有必然联系,你得理解TCP是一个流,建议多看书。

论坛徽章:
1
处女座
日期:2014-09-18 16:18:00
10 [报告]
发表于 2014-07-15 23:34 |只看该作者
回复 9# hellioncu
通过他这个问题我想问问大大,如果说发送端的数据长度大于线路的MTU,肯定会被TCP强行分解吧?假设分解为两包,第一包迷失了,第二包顺利到达了,第一包应该还会被超时重传吧?还是说两包都会被重传?
假设是只重传第一包,那么到达的顺序不就反了?那我这一包解包肯定会失败把,那这一包数据就丢掉了么。
就像下面的   [包头|长度|data1|data2|校验和] -----> 接收到的是[data2|校验和|包头|长度|data1]
突然想到的。。。。还是个学生没有什么经验,请教一下

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP