使用System.Net.Sockets SendFile后检索数据

时间:2012-06-08 15:07:06

标签: vb.net sockets sendfile

我在VB.NET中编写一个简单的TCP客户端/服务器来传输各种大小的文件。我决定使用System.Net.Sockets的命令SendFile通过套接字传输字节。

在接收端,我检索字节的代码工作得相当好,但偶尔会随机停止传输。

我发现通过在检索下一个数据块之间设置一个小的睡眠延迟使得传输100%稳定。

我的代码检索数据(直到没有数据可用)简化为:

While newSocket.Available > 0
    Threading.Thread.Sleep(100)
    newSocket.ReceiveFrom(data, Remote)
End While

我真的讨厌使用睡眠延迟并认为必须有一个正确的方法/函数来从SendFile中检索数据?

1 个答案:

答案 0 :(得分:1)

Socket.Available返回到目前为止尚未读取的总字节数。因此,如果您比其进入的速度更快地读取数据(这在慢速网络中很可能),即使客户端仍处于发送数据的中间,也不会有更多数据需要读取。

如果客户端为其发送的每个文件建立了与服务器的新连接,您只需将其更改为如下所示:

While newSocket.Connected
    If newSocket.Available > 0 Then
        newSocket.ReceiveFrom(data, Remote)
    End If
End While

但是,我建议使用异步调用,例如BeginReceive。然后,只要有要处理的数据,就会调用您的委托,而不是等待一个恒定的循环。请参阅此链接以获取示例:

http://msdn.microsoft.com/en-us/library/dxkwh6zw.aspx