Socket接收数据包

问题描述

我用socket接收数据,发送端发送了2000个字节的数据包,但是服务器接收数据包的时候接收的是两个被分开的数据包,但是这两个数据包的总和加起来是4973.后来我在大神的指导下,能接受一个完整的数据包,但是接收的这个数据包长度还是4973个。请问这是什么原因?谢谢

解决方案

解决方案二:
最好不要发送太大的数据包
解决方案三:
从你的问题看不出问题出在哪里。你可以在我贴出的一个例子的基础上做扩展和封装。在这个底层没有必要自己写。
解决方案四:
tcp发送的数据的大小,根据你的业务信令具体的实例而变化,可能只有几十个字节,也可能有几百万字节,都可以很好地发送接收,在数据大小方面没有什么一定之规。如果你在这个上面非常“被动”、总是感觉好像需要变来变去地去给自己设置“限制”,那说明底层技术还没有稳定下来,这可能就无法把精力用于搞好高层设计了。
解决方案五:
引用3楼sp1234的回复:

tcp发送的数据的大小,根据你的业务信令具体的实例而变化,可能只有几十个字节,也可能有几百万字节,都可以很好地发送接收,在数据大小方面没有什么一定之规。如果你在这个上面非常“被动”、总是感觉好像需要变来变去地去给自己设置“限制”,那说明底层技术还没有稳定下来,这可能就无法把精力用于搞好高层设计了。

发送的数据包长度是固定的,就是2000个字节,但是每次接受的时候接收的长度总是4000多。我使用socket一部接受的,我也不是很清楚我的代码有没有写错。可以帮忙看一下吗?protectedvirtualvoidReceiveData(IAsyncResultiar)//接收来自客户端的数据{Socketclient=(Socket)iar.AsyncState;byte[]datagramBytestodeal=newbyte[DefaultBufferSize];try{//如果两次开始了异步的接收,所以当客户端退出的时候//会两次执行EndReceiveintrecv=client.EndReceive(iar);if(recv==0){//正常的关闭CloseClient(client,Session.ExitType.NormalExit);return;}try{intdatagramLength=0;if(_datagramBuffer.Count(s=>s!=0)>0)//包缓存区里面不为null{datagramLength=datagramdongtailen;}Array.Copy(_recvDataBuffer,0,_datagramBuffer,datagramLength,recv);//拷贝到数据包缓冲区datagramdongtailen=datagramdongtailen+recv;intupdatedatagrambuffer=datagramLength+recv;if(_datagramBuffer[0]==21&&_datagramBuffer[updatedatagrambuffer-1]!=20){if(client.Connected){client.BeginReceive(_recvDataBuffer,0,_recvDataBuffer.Length,SocketFlags.None,newAsyncCallback(ReceiveData),client);}}elseif(_datagramBuffer[0]==21&&_datagramBuffer[updatedatagrambuffer-1]==20){Array.Copy(_datagramBuffer,0,datagramBytestodeal,0,_datagramBuffer.Length);if(_datagramBuffer.Count(s=>s!=0)>0){_datagramBuffer.Initialize();}AnalyzeDatagram(datagramBytestodeal,client);datagramdongtailen=0;client.BeginReceive(_recvDataBuffer,0,_recvDataBuffer.Length,SocketFlags.None,newAsyncCallback(ReceiveData),client);}elseif(_datagramBuffer[0]!=21&&_datagramBuffer[updatedatagrambuffer-1]!=20){Array.Copy(_datagramBuffer,0,datagramBytestodeal,0,_datagramBuffer.Length);AnalyzeDatagram(datagramBytestodeal,client);datagramdongtailen=0;client.BeginReceive(_recvDataBuffer,0,_recvDataBuffer.Length,SocketFlags.None,newAsyncCallback(ReceiveData),client);}}catch(Exceptionexp456){MessageBox.Show("数据包接收时测试连接返回信息"+exp456.Message);}}catch(SocketExceptionex){//客户端退出if(10054==ex.ErrorCode){//强制关闭客户端CloseClient(client,Session.ExitType.ExceptionExit);}}catch(ObjectDisposedExceptionex){if(ex!=null){ex=null;//DoNothing;}}}

解决方案六:
数据包收过来的时候分成两部分,第一部分是1024个,但是第二个数据包会包含第一个数据包的内容
解决方案七:
TCP的数据接收方和发送方是不需要协商数据包大小的,只管数据能够到达,所以需要的话要自己在数据中加入数据包大小,让接收方发满再处理.
解决方案八:
发送的长度是2000字节,并不代表接收端一定是2000LZ你的代码粘包了..

时间: 2024-12-22 15:58:21

Socket接收数据包的相关文章

线程-androidUDP通讯在接收数据包时能不能先暂停阻塞

问题描述 androidUDP通讯在接收数据包时能不能先暂停阻塞 while(true){socket.receive(pacakge);}socket和pacakge是定义的DatagramSocket和DatagramPacaket接收成功之后socket又在监听接收了,怎么才能暂时暂停一下这个阻塞,在另一个线程中使用这个socket发送一个数据包,然后再让这个socket继续监听接收?

关于socket udp 数据包传输时间的问题

问题描述 关于socket udp 数据包传输时间的问题 两台计算机型号和千兆以太网卡全部相同,其中一台计算机作为服务器端,另一台作为客户端,两者通过socket建立连接(udp连接),客户端单次向服务器端发送一百万数据包(每个数据包大小为1024字节),服务器端只接收不回应,则共耗时15秒左右,但若设置服务器端将每次接收到的数据包再原路传输回去,客户端发送一个数据包,再接收到一个数据包,则客户端发送一百万包的时间为650秒,请问两者的时间为什么相差这么大? 解决方案 socket之udp传输

python用socket解析数据包的问题

问题描述 python用socket解析数据包的问题 用python做个抓包工具,下面有写代码不明白,请老师指点一下. while True: packet = s.recvfrom(65565) packet = packet[0] ip_header = packet[0:20] iph = unpack('!BBHHHBBH4s4s' , ip_header) version_ihl = iph[0] version = version_ihl >> 4 ihl = version_ih

c# socket接收空包的问题

问题描述 c# socket接收空包的问题 我现在遇到一个socket切换通道的一个问题,一共2个socket通道,1个是长连接,另一个是用完后断开在去连接主socket,就是那个长连接的,在回到主通道的时候向服务器发送socket指令的时候收到空包,而服务器回包没有错,我这边就首次回到主通道发送socket指令有问题,后续都正常,求大神赐教这是神马问题.

asp.net c#.net Tcp socket 接收数据代码

asp教程.net c#.net tcp socket 接收数据代码  //监听网络          public bool opennet(string sport)        {             processor = new thread(new threadstart(startlistening));//新建监听线程             processor.priority = threadpriority.normal;             processor.

关于socket接收数据问题

问题描述 用的unity,c#写的,请问一下各位大神代码接收数据的问题,不知道为什么只能接收一次服务端返回的数据无法接受第二次!!!!整了半天也没弄懂,代码如下,注册功能:publicUIInputusername;publicUIInputpassword;publicclassStateObject{//Clientsocket.publicSocketworkSocket=null;//Sizeofreceivebuffer.publicconstintBufferSize=1024;//

socket接收数据问题

问题描述 第一次做socket,想知道用一个缓存区间接收数据是不是除了最后一次接收的数据有可能小于缓冲区的大小,前面几次每次都接收的是缓冲区大小,假如报文长度为5000个字节,我每次用1024字节的缓冲区接收,前面4次都是1024,只有最后一次小于1024,能不能这么理解 解决方案 解决方案二:不一定如果你是udp协议那么你包大小是多少发送过去接收就是多少如果你接收端的缓存小于发送包大小直接异常如果你是tcp协议那么就不一样了有可能你第一次只收到1000而不是1024这就看网络情况了解决方案三:

客户端Socket接收数据问题,跪求,谢谢,只要帮忙解决问题,可以付费的

问题描述 C#代码如下,客户端并发大概几百,以下代码会造成数据丢失吗?怎么呢保证完整接收数据呢,服务器端要求按照4个字节接收,按照我自己写的代码,循坏次数太多导致效率低下,怎么修改代码呢?List<byte> listByte = new List<byte>();//装载接收到的数据byte[] bytes;if (listByte.Count != 0){  listByte.Clear(); } while (true) {  bytes = new byte[1024]; 

C语言中经socket接收数据的相关函数详解_C 语言

recv()函数:头文件: #include <sys/types.h> #include <sys/socket.h> 定义函数: int recv(int s, void *buf, int len, unsigned int flags); 函数说明:recv()用来接收远端主机经指定的socket 传来的数据, 并把数据存到由参数buf 指向的内存空间, 参数len 为可接收数据的最大长度. 参数 flags 一般设0. 其他数值定义如下: 1.MSG_OOB 接收以out