Socket问题,发送端如何知道接收端已经接收完毕

Kation 2012-10-15 05:08:38
如题
我现在用BeginSend与BeginReceive
但是在SendCallBack的时候
服务器并不一定触发ReceiveCallBack
发送端for循环1000个32字节
SendCallBack后才发送下一个
但是
接收端只接收得500个不到
...全文
523 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kation 2012-10-15
  • 打赏
  • 举报
回复
搞清楚了。。。
原来是粘包的问题。。。
Kation 2012-10-15
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

按我的吧!肯定行,如:

【一个包长度】【总包数】【第几包】【值】【检验】

将总包数给ProgressBar.maxValue=【总包数】

第一次读:
【一个包长度】

将总包数给ProgressBar.CurrentValue=【第几包】
[/Quote]

我现在连续发送1000个数据
只有500个不到能接收
这个和数据包的内容没有关系!
KJ_Wang 2012-10-15
  • 打赏
  • 举报
回复
按我的吧!肯定行,如:

【一个包长度】【总包数】【第几包】【值】【检验】

将总包数给ProgressBar.maxValue=【总包数】

第一次读:
【一个包长度】

将总包数给ProgressBar.CurrentValue=【第几包】





Kation 2012-10-15
  • 打赏
  • 举报
回复
这样说吧
我有一个发送队列
只要里面有数据
就时时刻刻的往外发送数据,发送完毕一条,发送下一条
要做到无间隔发送

但是,发送的量越多,数据越小
那么服务器接收成功的数据也越少

无间隔发送应该能做到的吧?
不然那些服务器程序怎么支撑大量数据交换?
Kation 2012-10-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

你是要效率不要准确率啊,一般发送后都会等待对方返回应答包,才知道对方接受成功了吧,要不然对方没有接受到or接受错误,那不是白发了。。
[/Quote]
底层先解决效率
准确率什么的其它地方弄
Kation 2012-10-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

指定协议,尾部信息加上校验
[/Quote]
怎么个弄法?
我需要的是Socket类上的解决方法
你说的尾部信息加上校验什么的都不行

另外说一个情况,每次发送完毕sleep(10)就能几乎1000条全部接收完毕。
但是我想要连续发送,而不是有间隔
有间隔效率下降很多
KJ_Wang 2012-10-15
  • 打赏
  • 举报
回复
楼上说的是一种方法,其实最好的方法是先定好协议,计算一个包
用两条语句:
第一条读长度
socket.receive(buffers)//长度
算出长度
socket.receive(buffers)//值(包含校验)

保证不会出错!
KJ_Wang 2012-10-15
  • 打赏
  • 举报
回复
楼上说的是一种方法,其实最好的方法是先定好协议,计算一个包
用两条语句:
第一条读长度
socket.receive(buffers)//长度
算出长度
socket.receive(buffers)//值(包含校验)

保证不会出错!
Kation 2012-10-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

指定协议,尾部信息加上校验
[/Quote]
怎么个弄法?
我需要的是Socket类上的解决方法
你说的尾部信息加上校验什么的都不行

另外说一个情况,每次发送完毕sleep(10)就能几乎1000条全部接收完毕。
但是我想要连续发送,而不是有间隔
有间隔效率下降很多
pig357 2012-10-15
  • 打赏
  • 举报
回复
你是要效率不要准确率啊,一般发送后都会等待对方返回应答包,才知道对方接受成功了吧,要不然对方没有接受到or接受错误,那不是白发了。。
bdmh 2012-10-15
  • 打赏
  • 举报
回复
指定协议,尾部信息加上校验
SocketUpEx 2012-10-15
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
发送端如何知道接收端已经接收完毕
[/Quote]

接收端接收完成发个消息给发送端

Kation 2012-10-15
  • 打赏
  • 举报
回复
楼上2个说的方法是可以,但是会影响效率啊
足球中国 2012-10-15
  • 打赏
  • 举报
回复
接收完毕发送个包给服务器。
当然服务器端与客户端都要有个超时设置。
jiafeimao86 2012-10-15
  • 打赏
  • 举报
回复
首先你定义数据的长度,校验等信息,然后在接收端接收的时候根据接收的数据长度和校验是否正确,如果正确接收端在发送数据到服务端告诉服务端数据接收完毕,继续发送下一条数据,这样就不会丢失了。。。
如果校验数据错误,可可以通知服务端重新发送。 在线程类里面有一个线程通间的通信类的。

110,538

社区成员

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

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

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