谁给我解释一下C# socket异步的实现机制? 悬赏分:50 | 解决时间:2010-1-3 14:06 | 提问者:zhou0996 1.调用beginsend 之后,是马上执行sendCallback 回调,还是发送完成了执行? 2.调用beginReceive()之后,一收到数据就执行ReceiveCallback 回调,还是缓冲区满了时,还是收到数据缓冲区未满超过某个时间执行回调? 3.发送完成之后是客户端最后一次调用beginSend()之后发送端关闭socket 先,还是接收端收到最后一次数据,然后接收端关闭 socket 先再轮到发送端关闭socket? 最后,如果有C# socket 异步传输文件的例子就最好啦,先感谢下好心人~ ~ ! 最佳答案 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),...