- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不知道为什么我的 Socket.BeginSendFile 一次只能发送两个文件。我在不同的计算机上测试了相同的结果。
Socket.BeginSend 似乎一次发送了所有三个。
我测试了将三个客户端连接到服务器。效果很好,所有三个都按预期连接异步。每个客户端(图片中的Test100.exe,Test200.exe,Test300.exe)将根据服务器所连接的客户端从服务器名为100、200或300的文件夹中请求文件。
问题是 Socket.BeginSendFile 一次最多只向流发送两个文件。一旦两个以前称为的Socket.BeginSendFile 中的一个完成。见下文;
前两个客户端之一发送完成发送后,第三个客户端就开始接收。
在代码中添加一些断点,我可以确定所有三个Socket.BeginSendFile(...)都被称为异步。
private static void Send(Socket handler, String data)
{
string dateFolder = data.Replace("<EOF>", "");
string longFileName = "C:\\"+dateFolder+"\\poopoo.txt";
string shortFileName = "poopoo.txt";
// ==== for beginSend
//byte[] fileData = File.ReadAllBytes(longFileName);
// ==== for beginSend
byte[] fileNameByte = Encoding.ASCII.GetBytes(shortFileName);
byte[] fileInfo = Encoding.ASCII.GetBytes("C:\\Users\\Trim\\Desktop");
byte[] fileInfoLen = BitConverter.GetBytes(fileInfo.Length); // we know these are ints (4bytes)
byte[] clientData = new byte[4 + fileNameByte.Length + fileInfoLen.Length + fileInfo.Length];// + fileData.Length + eofByte.Length
// ==== for beginSend
//byte[] clientData = new byte[4 + fileNameByte.Length + fileInfoLen.Length + fileInfo.Length + fileData.Length];
// ==== for beginSend
byte[] fileNameLen = BitConverter.GetBytes(fileNameByte.Length); // we know these are int (4bytes);
fileNameLen.CopyTo(clientData, 0);
fileNameByte.CopyTo(clientData, 4); // room for error file name 4bytes?
fileInfoLen.CopyTo(clientData, 4 + fileNameByte.Length);
fileInfo.CopyTo(clientData, 4 + fileNameByte.Length + fileInfoLen.Length);
// ==== for beginSend
//fileData.CopyTo(clientData, 4 + fileNameByte.Length + fileInfoLen.Length + fileInfo.Length);
// ==== for beginSend
// *** Break point shows all three being called async
handler.BeginSendFile(longFileName, clientData, null, 0, new AsyncCallback(AsynchronousFileSendCallback), handler);
// handler.BeginSend(clientData, 0, clientData.Length, 0, new AsyncCallback(SendCallback), handler);
}
private static void AsynchronousFileSendCallback(IAsyncResult ar)
{
// Retrieve the socket from the state object.
Socket client = (Socket)ar.AsyncState;
// Complete sending the data to the remote device.
client.EndSendFile(ar); // **Third** client doesn't actually start receiving his data until EndSendFile is called atleast once.
Console.WriteLine("Send file to client.");
// sendDone.Set();
client.Shutdown(SocketShutdown.Both);
client.Close();
}
byte[] fileData = File.ReadAllBytes(longFileName);
。BeginSend结构对于大文件是 Not Acceptable :(
最佳答案
BeginSendFile很可能使用Windows API函数TransmitFile来完成其工作。并且此API限于Windows客户端版本上的2个并发传输。
Workstation and client versions of Windows optimize the TransmitFile function for minimum memory and resource utilization by limiting the number of concurrent TransmitFile operations allowed on the system to a maximum of two. On Windows Vista, Windows XP, Windows 2000 Professional, and Windows NT Workstation 3.51 and later only two outstanding TransmitFile requests are handled simultaneously; the third request will wait until one of the previous requests is completed.
关于c# - C#异步Socket.BeginSendFile仅发送两个异步文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14608508/
我是一名优秀的程序员,十分优秀!