2 pan422130300 pan422130300 于 2016.09.12 14:45 提问

socket客户端收包方式问题

问个问题,客户端用socket收包,Receive方法接受缓冲4096个字节,当包大小大于4096字节时候,是不是会Receive到2次?要把前面的缓存起来然后拼合?
还有socket接受到的包是不是100%连续的?会不会因为网络原因丢了包,而导致前后包不一致?

1个回答

qq_29594393
qq_29594393   Ds   Rxr 2016.09.12 15:00

不是连续的100%的原因是由于缓冲区并不一定是4096的整数倍,所以有时候接收的数据不到4096,但是还没有接收完,,
丢包,基本上没碰过丢包的情况,如果真的丢包了,没办法,重传.
收到数据时,先把收到的数据自动拼接再提取就没有问题

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
一次刨根问底的socket收包过程(Linux)
Linux会对一个网络包(packet)的收和发做大量的处理。packet在被发送之前会被存在队列中,而在被接受之后也会存在队列中,共有三个队列:reception(接收),transmission(发送)和Backlog。它们都受到spinlock的保护,是为了保证在并发访问时的一致性。言归正传,接下来看看当一个packet到达NIC(网卡)时,linux都会做些什么工作。 先来看一个图(来自
socket通信中包不全问题
还记得之前我写的一篇博客,说的是奇怪的在通信接收函数后调用Sleep函数,解决接收包冲突问题。今天终于得到正解了。           我当时的分析是,程序执行太快,CPU还没有来的急执行写缓冲区操作。但事实是这样嘛?答案是是的。因为网络通信总是会有延时的。所以往往在处理大的数据时,会遇到数据缓冲区还没有被写,却被读取了。特别是当发送的数据包被TCP协议自动分包后,诡异的现象会发现很多很多。但是
Unix Socket --- 原始套接字(Raw Socket)
Unix Socket
常用的网络驱动收包方式
noNAPI:       MAC每收到一个包或者BD即产生一个中断,缺点是网络PPS高时,CPU将大部分时间耗费在了MAC中断上。 netpoll:       轮询收包,实时性差。 NAPI:       中断+轮询方式,MAC收到第一个包时产生中断,收包程序中关闭该中断,启动轮询收包,知道收完buffer中的所有包或者是netdev_max_backlog个包之后,重新打开中断。S
C#:简单的Socket异步通信功能(客户端)
上一篇(http://www.rexcao.net/archives/159)讲了服务端使用Socket发送消息的方法,这一篇来解决一下客户端如何接收服务端消息的问题。 目标 1、异步接收服务端消息并显示 2、发送自定义消息给服务端(由于上一篇做的是Windows服务,没有界面,这个需要另行处理才可以显示客户端的消息) 思路 1、异步从一个已连接的Socket对象中获
程序员须知 收包与发包
本文为作者原创翻译并且加入了一些自己的思路和观点,转载请注明。作者:rellikt@gmail.com首发链接:http://blog.csdn.net/rellikt/archive/2010/08/23/5833233.aspx原文链接:http://gafferongames.com/networking-for-game-programmers/sending-and-receiving-packets/简介大家好,今天我们就来说说网络游戏程序员须知的第二篇:收包与发包。上一篇中我们比较了UDP和T
lwip_循环查询方式_接受数据包
static void ethernet_timer_init(void) { ... ... ... } int ethernet_init(void) { ... ... ... // Initialize LWIP lwip_init(); // Add our netif to LWIP i
服务端和客户端连接的两种方式,socket和DatagramSocket
socket有两种方式, 一种是Serversocket(服务端)和socket(客户端)的方式(基于tcp/ip的通信方式) 另一种是DatagramSocket(客户端和服务端)的方式(基于udp的通信方式) 第一种服务端需要绑定端口和ip,客户端监听服务端时需要知道服务端的端口和ip(可以不用绑定客户端的端口和ip,系统会自动分配端口给客户端),这种方式适合传输大型文件(几个G的游戏文
socket循环接收问题
import socket server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM) server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True) server_socket.bind(('',8080)) server_socket.listen(...
TCP UDP 调试工具,发包收包工具
SocketTool TCP UDP 调试工具,发包收包工具