问题描述
我用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你的代码粘包了..