BeginReceive主要使用异步接收,一般都是Socket.BeginReceive(buffer, 0, 1024, 0,new AsyncCallback(Read_Callback), Socket);
由于需要指定接收数据的大小,如这里的1024字节,但在连续接收数据时,如果对方每次发送的一帧数据是1536字节,那么本地第一次将接收第一帧的1024个字节,第二次将接收第一帧的512字节和第二帧的512字节,第三次接收第二帧的1024个字节数据。
那么如何对第一帧数据和第二帧数据进行区分呢!特别是每次发送过来一帧数据长度不确定的话,就感觉更难区分了!
请问大家是怎么处理的呢?有没向UDPCLIENT.BEGINRECEIVE那样,不需要给定接收区长度,不需要自己去判断每一帧的?
由于需要指定接收数据的大小,如这里的1024字节,但在连续接收数据时,如果对方每次发送的一帧数据是1536字节,那么本地第一次将接收第一帧的1024个字节,第二次将接收第一帧的512字节和第二帧的512字节,第三次接收第二帧的1024个字节数据。
那么如何对第一帧数据和第二帧数据进行区分呢!特别是每次发送过来一帧数据长度不确定的话,就感觉更难区分了!
请问大家是怎么处理的呢?有没向UDPCLIENT.BEGINRECEIVE那样,不需要给定接收区长度,不需要自己去判断每一帧的?
1、如果DATA中有“BEGIN”会导致判断头字节出错,这该如何是好!?
2、因为是异步的,如上所述,如果我第三帧的数据比第二帧的先到,就会导致我从第一帧取了1024个字节,从第三帧取512字节的错误组合!
1. 不懂你的“出错”是什么意思。2. 异步Receive不是你说的第三帧比第二帧先到(且不管这里的“帧”这个词是否合适)。异步Receive,也是顺序读取数据的。你不妨实际去看看异步Receive的代码。
的demo代码。明明是在一个Read_Callback方法中才去异步读取下一块数据(执行s.BeginReceive),不可能“第三帧比第二帧先到”。
2 命令 序号 长度\r\n <负载内容> 这个是传输大量数据用的,先通过\r\n获得主要的头,在从头中获得长度,接着取后面数据。然后你定义的命令是自己设计的,可以不出现\r\n,内容中的\r\n你可以自己转义。具体协议格式当然是自己根据情况决定了。对于异步你理解不对。TCP保证可靠的、顺序的(数据包以发送的顺序接收)以及不会重复的数据传输。
中的例子是在循环接受数据,但是在INTERNET中,会存在后发的数据比先发的数据先到远端的情况,我这里就暂叫帧吧(专业术语知道话麻烦告知下),这样就会出现我上面描述的错误取到第三帧数据的情况!