我相信SendPacketsAsync
是将高性能套接字与SocketAsyncEventArgs
一起使用时发送较大文件的最佳方法。首先,我正在使用Marcos Hidalgo Nunes's example。
我在SocketClient.cs中添加了以下功能
internal void SendFile(byte[] data)
{
if (connected)
{
using (SocketAsyncEventArgs completeArgs = new SocketAsyncEventArgs())
{
List<SendPacketsElement> list = new List<SendPacketsElement>();
string filename = "putty32";
string pathname = @"C:\Users\Admin\Desktop\putty32.exe";
byte[] header = new byte[12 + filename.Length * 2];
FileStream fs = new FileStream(pathname, FileMode.Open, FileAccess.Read);
int filelen = (int)fs.Length;
fs.Close();
GCHandle handle = GCHandle.Alloc(header);
IntPtr p = Marshal.UnsafeAddrOfPinnedArrayElement(header, 0);
Marshal.WriteInt32(p, header.Length);
Marshal.WriteInt32(p + 4, filelen);
Marshal.WriteInt32(p + 8, filename.Length * 2);
handle.Free();
Encoding.Unicode.GetBytes(filename, 0, filename.Length, header, 12);
list.Add(new SendPacketsElement(header));
list.Add(new SendPacketsElement(pathname));
completeArgs.SendPacketsElements = list.ToArray();
//completeArgs.UserToken = clientSocket;
//completeArgs.RemoteEndPoint = hostEndPoint;
completeArgs.Completed += new EventHandler<SocketAsyncEventArgs>(OnSend);
// Start sending asyncronally.
clientSocket.SendPacketsAsync(completeArgs);
// Wait for the send/receive completed.
WaitHandle.WaitAll(autoSendReceiveEvents);
}
}
else
{
throw new SocketException((int)SocketError.NotConnected);
}
}
应该将文件发送到服务器,这分别是客户端程序中的执行代码。cs
byte[] data = File.ReadAllBytes("putty32.exe");
sa.SendFile(data);
您可以在开头的链接中找到服务器端代码,或者为防万一在pastebin上上传了服务器端代码。
这种方式的问题是,它要求服务器上的缓冲区为774226,因为这是PuTTy的实际大小。当前的缓冲区是32767,我不想将其更改为更高的缓冲区,因为如果要发送的文件更大(比实际缓冲区的大小大),它将根本无法工作。也许,最好的解决方案是将文件分成缓冲区大小为32767的多个块。
你们能给我提供一些例子还是告诉我使用SocketAsyncEventArgs
时将较大的文件从客户端发送到服务器的最佳解决方案是什么?