关于SOCKET tcp/ip协议通信 50
服务器-》WINDOWSERVER20003操作系统,JAVA语言,NETTY框架,非阻塞模式终端-》LINUX操作系统,C++语言,阻塞模式现在终端与服务器通信的时候出...
服务器-》WINDOW SERVER 20003操作系统,JAVA语言,NETTY框架,非阻塞模式
终端-》LINUX操作系统,C++语言,阻塞模式
现在终端与服务器通信的时候出现如下问题:终端每次只能接受到不超过100个字节的数据包,如果超过100个字节,那么超过100个字节的那部分数据与下一条数据包粘合在一起发送过来,请问这种情况是什么原因造成的
回一楼,终端设置的是一次读取1024字节的,不存在你说的那种情况,并且如果我把服务器换成另一个电脑的话,收发就好了,所以我猜想会不会更硬件或者网络环境有关 展开
终端-》LINUX操作系统,C++语言,阻塞模式
现在终端与服务器通信的时候出现如下问题:终端每次只能接受到不超过100个字节的数据包,如果超过100个字节,那么超过100个字节的那部分数据与下一条数据包粘合在一起发送过来,请问这种情况是什么原因造成的
回一楼,终端设置的是一次读取1024字节的,不存在你说的那种情况,并且如果我把服务器换成另一个电脑的话,收发就好了,所以我猜想会不会更硬件或者网络环境有关 展开
1个回答
展开全部
没看代码,只有猜测。
最可能的是终端READ的时候只READ了100个字节,这个可能是由于缓存大小造成的,可能是显示的表明了一次只READ100个字节。
那剩余的数据在哪?系统内核区的缓冲内,整个SOCKET的IO是这样的:网卡先读取数据到网卡的缓冲区内,然后复制系统内核区的缓冲区内(系统分配维护),最后READ读到用户区的缓冲内,你每次READ的这部分数据,系统会把这部分数据从内核缓冲区里FLUSH掉。所以你下次READ,就从上次读完的位置继续开始读,自然也就和粘合在一起了。这里也就隐含说明了一个问题,如果长期没有READ数据,但是服务器一直在往客户端发,这个系统的内核区的缓冲迟早要满的,这样就导致系统会将后来的包丢掉。
其他的问题,也不排除其他设置的问题,应该是小问题。
补充:那或许只是配置的问题了。没代码,只能猜
最可能的是终端READ的时候只READ了100个字节,这个可能是由于缓存大小造成的,可能是显示的表明了一次只READ100个字节。
那剩余的数据在哪?系统内核区的缓冲内,整个SOCKET的IO是这样的:网卡先读取数据到网卡的缓冲区内,然后复制系统内核区的缓冲区内(系统分配维护),最后READ读到用户区的缓冲内,你每次READ的这部分数据,系统会把这部分数据从内核缓冲区里FLUSH掉。所以你下次READ,就从上次读完的位置继续开始读,自然也就和粘合在一起了。这里也就隐含说明了一个问题,如果长期没有READ数据,但是服务器一直在往客户端发,这个系统的内核区的缓冲迟早要满的,这样就导致系统会将后来的包丢掉。
其他的问题,也不排除其他设置的问题,应该是小问题。
补充:那或许只是配置的问题了。没代码,只能猜
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
Storm代理
2023-07-25 广告
2023-07-25 广告
StormProxies是一家国内优质海外HTTP代理商,拥有一个庞大的IP资源池,覆盖200多个地区,IP数量大且匿名度高。其优点还包括超高并发、稳定高效、技术服务等特点,同时提供HTTP、HTTPS以及SOCKS5协议支持。此外,Sto...
点击进入详情页
本回答由Storm代理提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询