我正在尝试使用System.Net.Sockets内的TCP /套接字函数来传输文件。 但是,当我尝试在客户端和服务器上动态设置缓冲区的大小时,如果大小小于4096,则transfert运行良好,但如果它超过4096,则缓冲区保持4096值,因此文件是没完全收到。
所以,我在想?这是最大值吗? 如果是,使用缓冲区是否安全,该缓冲区由客户端上的循环填充并在服务器上使用相同的方法接收?
感谢您的帮助。
答案 0 :(得分:0)
我已经编写了一个类似且非常简单的文件接收器,只有一次套接字(只是为了尝试套接字,所以代码并不是那么漂亮):
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
EndPoint endpoint = new IPEndPoint(IPAddress.Any, 2442);
socket.Bind(endpoint);
socket.Listen(10000);
System.Console.WriteLine("Waiting for incoming data on *:2442");
Socket client = socket.Accept();
byte[] buffer = new byte[2000];
List<byte> wholeThing = new List<byte>();
int count = 0;
do {
count = client.Receive(buffer);
for (int i = 0 ; i < count ; i++)
wholeThing.Add(buffer[i]);
System.Console.Write("*");
} while (count > 0);
System.Console.WriteLine(Environment.NewLine + "Received {0} bytes of data", wholeThing.Count);
File.WriteAllBytes(Application.StartupPath + "\\receivedFile", wholeThing.ToArray());
发件人代码如下所示:
byte[] fileData = File.ReadAllBytes(fileName);
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(IPAddress.Parse(targetip), 2442);
int offset = 0;
do {
try {
offset = socket.Send(fileData, offset, fileData.Length - offset, SocketFlags.None);
} catch {
socket.Close();
throw;
}
} while (offset < fileData.Length);
答案 1 :(得分:0)
如果您尝试发送较大的文件.net通常将它们分成较小的块。您需要在客户端逐个接收数据时重新组合数据。我认为networkComms.net第134行here中的ConnectionPacketBuilder类实现了您想要做的事情。您可以看到它是如何使用的,因为数据来自第793行。