使用SocketAsyncEventArgs发送大文件

时间:2019-05-17 09:50:08

标签: c# file send socketasynceventargs

我相信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时将较大的文件从客户端发送到服务器的最佳解决方案是什么?

0 个答案:

没有答案