问个异步socket判断接收的问题

jy251 2009-08-31 02:12:13
一般情况下来看,异步是否接收到数据是看bytesRead的值,代码如下

int bytesRead = socket.EndReceive(ar);

if (bytesRead > 0)
{
//......
}
else
{
//......
}

我的问题是如何判断对方是否发送完毕?因为这个涉及到我是否需要继续接收的问题。

是这样的,socket的beginreceive是采用调用回调的方式来处理,那么我想知道的是beginreceive的接收能力如何,也就是说beginreceive这个委托指向的函数(socket自己实现的)是执行完毕接收工作之后才返回呢?还是接收到微软自己限定的大小就返回???或者这样来问,当socket.EndReceive被释放阻塞的时候,bytesRead到底是这一次交互的所有内容的长度,还是这一次交互的部分长度?

MSDN中的例子是让我们使用一个结束标志符号,比如<EOF>,来判断是否发送完毕,但是如果我不使用结束标志符号的话,我能否判断是否接收完毕了?

网上有的地方说bytesRead=0就可以判断了,并且MSDN上也是这么说的,但是我觉得很疑惑,因为我从来没有发现bytesRead会有等于0的情况(小于0就不说了,异常断开什么的也不说了)。比如对方发送一个字符串“11”,那么我这边bytesRead就是2,如果这个时候,对方因为发送完毕而正常退出,那么我这边怎么办??我是处理这个呢?还是继续receive?

大家帮帮忙吧,之前发过几个帖子。。。只有2个帖子让我看到了真正的回复。。。
...全文
210 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jy251 2009-08-31
  • 打赏
  • 举报
回复
恩,好的,谢谢了,问题已经明确了,呵呵

要的就是你的一句话 你不能指望一次性读完所有数据,缓冲区大小有限制,到达的数据数量也未必正合适

结分!
dancingbit 2009-08-31
  • 打赏
  • 举报
回复
不能,在你的接收动作之前,这些数据实际已经到达了系统并且经过了重组。
你不能指望一次性读完所有数据,缓冲区大小有限制,到达的数据数量也未必正合适。
对方发送一次,到达你这儿未必就是一次性地。

你可以去看看我回答的其他有关于网络的帖子。
jy251 2009-08-31
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zhgroup 的回复:]
这个可以发送终止符来确认会话终止,比如发送"close"来确认停止会话
[/Quote]

恩,是的,但是我现在有个问题。。。就是如果我不发送终止符号的话,还有没有其他的判断办法?

其实我是想要发送一个序列化的对象过去,所以我就不能在send的byte数组后面加结束符号了,难道是需要send对象之后,再来send一个标志,表示这次这个对象发送完毕吗?
jy251 2009-08-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dancingbit 的回复:]
对方ShutDown,这边会接收到0长度的数据。
蛤如果是持续性发送接收的话,一次发送的数据,一般还是使用标识性字符序列的多。
[/Quote]

对,是的,这个地方是我搞错了,因为是客户端,所以我send之后,并没有shutdown,因为还需要接收服务端的返回,那么服务端那边就自然不会bytesRead=0了。

既然这样,那我服务端的判断就必须要使用其他的方式了
zhgroup 2009-08-31
  • 打赏
  • 举报
回复
这个可以发送终止符来确认会话终止,比如发送"close"来确认停止会话
jy251 2009-08-31
  • 打赏
  • 举报
回复
bytesRead是有可能为0的,因为我刚调试的时候,服务端程序发送给客户端程序的时候就是会为0,但是客户端发送给服务端就不会有0存在的情况,我去检查下代码的问题。

另外 要视到达的数据量而定 这句话,我不是很理解,因为在我看来,send一次就算是一次通讯,无论数据量是多大,只要是我能够一次send的,是否都会被bytesRead所表示出来?也就是说,会被beginreceive的EndReceive返回呢?
dancingbit 2009-08-31
  • 打赏
  • 举报
回复
是这样的,socket的beginreceive是采用调用回调的方式来处理,那么我想知道的是beginreceive的接收能力如何,也就是说beginreceive这个委托指向的函数(socket自己实现的)是执行完毕接收工作之后才返回呢?还是接收到微软自己限定的大小就返回???或者这样来问,当socket.EndReceive被释放阻塞的时候,bytesRead到底是这一次交互的所有内容的长度,还是这一次交互的部分长度?
-------------------------------
可能是全部,可能是部分,要视到达的数据量而定。
dancingbit 2009-08-31
  • 打赏
  • 举报
回复
对方ShutDown,这边会接收到0长度的数据。
蛤如果是持续性发送接收的话,一次发送的数据,一般还是使用标识性字符序列的多。
jy251 2009-08-31
  • 打赏
  • 举报
回复
我刚又想了想,这种判断的话,难道我必须使用同步加异步的方式吗?
也就是说,第一次send是使用结束标识符,我接收到这个符号之后,再使用同步方式传输数据,或者接收数据??

110,552

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧