SocketAsyncEventArgs文件传输

gongjie416 2013-06-25 03:28:08
c#写了个SocketAsyncEventArgs接收数据的控制台程序了,但是接收文件却一直出错,
找过好多资料了,不过关于SocketAsyncEventArgs接收文件的实在没找到,请大家帮帮忙
...全文
119 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
gongjie416 2013-06-27
  • 打赏
  • 举报
回复
做的对的话也不会出来发贴子的,就是不太会做才找人解决,能解决不,我是来找答案,不是来听你费话的
gongjie416 2013-06-27
  • 打赏
  • 举报
回复
做的对的话也不会出来发贴子的,就是不太会做才找人解决,能解决不,我是来找答案,不是来听你费话的
Carpathia 2013-06-25
  • 打赏
  • 举报
回复
引用 6 楼 gongjie416 的回复:
这个是接收数据的方法,请问下,如果我要接收文件应该 在这里如何写 private void ProcessReceive(SocketAsyncEventArgs e) { // 检查远程主机是否关闭连接 if (e.BytesTransferred > 0) { if (e.SocketError == SocketError.Success) { Socket s = (Socket)e.UserToken; //判断所有需接收的数据是否已经完成 if (s.Available == 0) { // 设置发送数据 Array.Copy(e.Buffer, 0, e.Buffer, e.BytesTransferred, e.BytesTransferred); e.SetBuffer(e.Offset, e.BytesTransferred * 2); if (!s.SendAsync(e)) //投递发送请求,这个函数有可能同步发送出去,这时返回false,并且不会引发SocketAsyncEventArgs.Completed事件 { // 同步发送时处理发送完成事件 this.ProcessSend(e); } } else if (!s.ReceiveAsync(e)) //为接收下一段数据,投递接收请求,这个函数有可能同步完成,这时返回false,并且不会引发SocketAsyncEventArgs.Completed事件 { // 同步接收时处理接收完成事件 this.ProcessReceive(e); } } else { this.ProcessError(e); } } else { this.CloseClientSocket(e); } }
你这个逻辑一塌糊涂,根本就没理解.NET IOCP的逻辑流程 传输协议怎么定的?粘包处理呢? Receive方法里写的Array.Copy(e.Buffer, 0, e.Buffer, e.BytesTransferred, e.BytesTransferred);是啥意思?将收到的缓冲数据再重复拷贝一份复制到自身? 另外,s.SendAsync(e)=false表示的是不会触发Complated回调事件,你还硬要进行ProcessSend, e.SetBuffer(e.Offset, e.BytesTransferred * 2);表示你根本没有粘包的计划,估计传输协议也没有定 s.ReceiveAsync(e)也是一样 接收异常处理也不完整
gongjie416 2013-06-25
  • 打赏
  • 举报
回复
这个是接收数据的方法,请问下,如果我要接收文件应该 在这里如何写 private void ProcessReceive(SocketAsyncEventArgs e) { // 检查远程主机是否关闭连接 if (e.BytesTransferred > 0) { if (e.SocketError == SocketError.Success) { Socket s = (Socket)e.UserToken; //判断所有需接收的数据是否已经完成 if (s.Available == 0) { // 设置发送数据 Array.Copy(e.Buffer, 0, e.Buffer, e.BytesTransferred, e.BytesTransferred); e.SetBuffer(e.Offset, e.BytesTransferred * 2); if (!s.SendAsync(e)) //投递发送请求,这个函数有可能同步发送出去,这时返回false,并且不会引发SocketAsyncEventArgs.Completed事件 { // 同步发送时处理发送完成事件 this.ProcessSend(e); } } else if (!s.ReceiveAsync(e)) //为接收下一段数据,投递接收请求,这个函数有可能同步完成,这时返回false,并且不会引发SocketAsyncEventArgs.Completed事件 { // 同步接收时处理接收完成事件 this.ProcessReceive(e); } } else { this.ProcessError(e); } } else { this.CloseClientSocket(e); } }
gongjie416 2013-06-25
  • 打赏
  • 举报
回复
是一个意思,但是在用文件流写入的时候老是会出错,所以想请教各位
Carpathia 2013-06-25
  • 打赏
  • 举报
回复
引用 3 楼 gongjie416 的回复:
这个早已经找过了,是要接收文件,不是数据
不就一个意思么,文件就是数据呀
gongjie416 2013-06-25
  • 打赏
  • 举报
回复
这个早已经找过了,是要接收文件,不是数据
gongjie416 2013-06-25
  • 打赏
  • 举报
回复
这个早已经找过了,是要接收文件,不是数据
threenewbee 2013-06-25
  • 打赏
  • 举报
回复
http://stackoverflow.com/questions/9170126/how-to-use-socket-sendasync-to-send-large-data

110,567

社区成员

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

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

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