繁体   English   中英

C#Socket.send非常慢

[英]C# Socket.send is very slow

我正在使用Socket类将字节数组中的图像数据发送到在同一台PC上运行的第三方程序(因此,我不必担心连接问题)。 由于我的应用程序非常简单,因此仅使用同步send(bytes)函数,仅此而已。 问题是,它运行非常缓慢。 如果我发送一幅20kB的小图片,大约需要15ms,但是如果一张图片足够大-1.5mB,则需要大约800ms,这对我来说是不可接受的。 如何提高套接字性能?

Socket sender = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
IPAddress ipAddress = ipHostInfo.AddressList[0];
IPEndPoint remoteEP = new IPEndPoint(ipAddress, 3998);
sender.Connect(remoteEP);

byte[] imgBytes;
MemoryStream ms = new MemoryStream();
Image img = Image.FromFile("С:\img.bmp");
img.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
imgBytes = ms.ToArray();
/*Some byte operations there: adding headers, file description and other stuff.
They are really fast and add just 10-30 bytes to array, so I don't post them*/

DateTime baseDate = DateTime.Now; // Countdown start

for (uint i = 0; i < 100; i++) sender.Send(byteMsg);

TimeSpan diff = DateTime.Now - baseDate; 
Debug.Print("End: " + diff.TotalMilliseconds);
// 77561 for 1.42mB image, 20209 for 365kb, 1036 for 22kB.

这可能是将一个大文件读取到内存流,将其复制到数组,然后重新分配该数组以在其前面添加一些数据,这实际上会影响性能,而不是Socket.send()。

尝试使用流到流的复制方法:

        Socket sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
        IPAddress ipAddress = ipHostInfo.AddressList[0];
        IPEndPoint remoteEP = new IPEndPoint(ipAddress, 3998);
        sender.Connect(remoteEP);
        using (var networkStream = new NetworkStream(sender))
        {
            // Some byte operations there: adding headers, file description and other stuff.
            // These should sent here by virtue of writing bytes (array) to the networkStream

            // Then send your file
            using (var fileStream = File.Open(@"С:\img.bmp", FileMode.Open))
            {
                // .NET 4.0+
                fileStream.CopyTo(networkStream);

                // older .NET versions
                /*
                byte[] buffer = new byte[4096];
                int read;
                while ((read = fileStream.Read(buffer, 0, buffer.Length)) > 0)
                    networkStream.Write(buffer, 0, read);
                */
            }
        }

问题在另一方面。 我正在使用CCV套接字修改作为服务器,看来,即使在接收图片时,该程序也会进行大量操作。 我已经尝试使用测试服务器应用程序(来自Microsoft的Synchronous Server Socket Example并从中删除了字符串分析)来解决我的代码,因为这一切开始的速度几乎快100倍。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM