谁给我解释一下C# socket异步的实现机制?

1.调用beginsend之后,是马上执行sendCallback回调,还是发送完成了执行?2.调用beginReceive()之后,一收到数据就执行ReceiveCal... 1.调用beginsend之后,是马上执行sendCallback回调,还是发送完成了执行?
2.调用beginReceive()之后,一收到数据就执行ReceiveCallback回调,还是缓冲区满了时,还是收到数据缓冲区未满超过某个时间执行回调?
3.发送完成之后是客户端最后一次调用beginSend()之后发送端关闭socket先,还是接收端收到最后一次数据,然后接收端关闭 socket先再轮到发送端关闭socket?
最后,如果有C# socket 异步传输文件的例子就最好啦,先感谢下好心人~~!
展开
 我来答
IoriDX
2009-12-17 · 超过15用户采纳过TA的回答
知道答主
回答量:58
采纳率:0%
帮助的人:38.9万
展开全部
1.发送完了执行。(假设你要发送一个很大的文件,要分好几次发送,第一次还没发完就回调了,在回调函数中再来第二次发送不就出异常了)。
2.数据接收完毕或者缓冲区满了时。(如果没有数据发过来,这个线程会一直挂起,没有“超过某个时间就回调”的说法)。
3.数据发送完毕和关闭Socket有什么联系呢,数据发送完了,Socket连接还在呀, 除非你调用了Socket.ShutDown(SocketShutdown.Both)时就不能收发数据了,Socket.Close()才会关闭Socket,Socket的关闭是由你来控制的。

例子:(随便写了几句代码,给你加点注释)

int i;
int size = 1024;
byte buffer = new byte[size];
//读文件
FileStream fs =new FileStream(filename,FileMode.Open,FileAccess.Read);
//将文件转化成二进制流(不然怎么传)
BinaryReader br = new BinaryReader(fs);
Socket sock = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
//连接对方主机的ip地址和侦听端口
sock.Connect(ip, port);
//将文件的二进制流读入缓冲区
br.Read(buffer, 0, size);
//将缓冲区的内容异步发送出去,委托回调函数EndSendFile()在后面
sock.BeginSend(buffer, 0, size, SocketFlags.None,
new AsyncCallback(EndSendFile), null);

private void EndSendFile(IAsyncResult AR)
{
//结束挂起的异步发送
sock.EndSend(AR);
//判断文件是否读完,没读完继续读到缓冲区
if ((i = br.Read(buffer, 0, size)) != 0)
{
//发送缓冲区内容,你看清楚回调函数(就是本函数)
//就是说这次发送完后又调用这个函数来判断和发送
sock.BeginSend(buffer, 0, size, SocketFlags.None,
new AsyncCallback(EndSendFile), null);
}
}

这是我随便写的几句代码,不过我以前都实践过的,应该是对的,你想运行它的话,还要自己加点东西,还要写个接收程序(异步接收的话就用你说的BeginReceive()试一试)。
camwind
2009-12-10 · TA获得超过1090个赞
知道小有建树答主
回答量:1841
采纳率:12%
帮助的人:215万
展开全部
Windows Socket共有5种I/O模型:,它们包括: s e l e c t
(选择)、W S A A s y n c S e l e c t(异步选择)、W S A E v e n t S e l e c t(事件选择)、o v e r l a p p e d(重叠)
以及completion port(完成端口)。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式