Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 接收的数据与通过c sharp套接字发送的数据不同_C#_Sockets_Byte_Send - Fatal编程技术网

C# 接收的数据与通过c sharp套接字发送的数据不同

C# 接收的数据与通过c sharp套接字发送的数据不同,c#,sockets,byte,send,C#,Sockets,Byte,Send,我试图将一个文件从客户端发送到服务器,因此我将文件加载到客户端的字节数组中,并通过send()方法将其发送到服务器,但接收到的数组与发送的数组不同,并且比发送的数组大,我想知道这是否是协议问题(但我使用的tcp协议确保错误检测): 客户端代码: IPAddress ipAddress = new IPAddress(ip); IPEndPoint ipEnd = new IPEndPoint(ipAddress, 5656); Socket clientSock = new Socket(Add

我试图将一个文件从客户端发送到服务器,因此我将文件加载到客户端的字节数组中,并通过send()方法将其发送到服务器,但接收到的数组与发送的数组不同,并且比发送的数组大,我想知道这是否是协议问题(但我使用的tcp协议确保错误检测):

客户端代码:

IPAddress ipAddress = new IPAddress(ip);
IPEndPoint ipEnd = new IPEndPoint(ipAddress, 5656);
Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

FileStream fl = File.Open("pos.xls",FileMode.Open);
byte[] fileData = ReadFully(fl);
fl.Close();  

byte[] clientData = new byte[ fileData.Length];
fileData.CopyTo(clientData,0);

curMsg = "Connection to server ...";
clientSock.Connect(ipEnd);

curMsg = "File sending...";
clientSock.Send(clientData);

curMsg = "Disconnecting...";
clientSock.Close();
curMsg = "File transferred."; 
服务器代码:

curMsg = "Starting...";
sock.Listen(100);

curMsg = "Running and waiting to receive file.";
byte[] clientData = new byte[1024 * 5000];
while (true)
{
    Socket clientSock = sock.Accept();

    clientData = new byte[1024 * 5000];

    int receivedBytesLen = clientSock.Receive(clientData);
    curMsg = "Receiving data...";

    FileStream fz = writeFully(clientData);
    fz.Close();
    curMsg = "Saving file...";
您已经定义了
clientData=新字节[1024*5000]-然后就不使用
receivedBytesLen
。我不记得在EOF之前,
Receive
重载是否会读取尽可能多的内容,或者只是“some”或“EOF”(后者是
流的读取行为),但您必须验证并使用
receivedBytesLen

在我看来,固定缓冲区的方法本身是有缺陷的,因为它也不能很好地处理过大的输入。就个人而言,我会在这里使用
NetworkStream
;然后,您的整个代码变成:

using(var fz = File.Create(path)) {
    networkStream.CopyTo(fz);
}
这里的另一种常见方法是将预期大小作为前缀发送给数据;这样,您就可以验证您是否拥有所需的数据。不过,我个人不会使用此信息在内存中创建正确大小的缓冲区,因为这仍然不允许史诗大小的文件(但是,
流确实允许)。

您已经定义了
clientData=new byte[1024*5000]-然后就不使用
receivedBytesLen
。我不记得在EOF之前,
Receive
重载是否会读取尽可能多的内容,或者只是“some”或“EOF”(后者是
流的读取行为),但您必须验证并使用
receivedBytesLen

在我看来,固定缓冲区的方法本身是有缺陷的,因为它也不能很好地处理过大的输入。就个人而言,我会在这里使用
NetworkStream
;然后,您的整个代码变成:

using(var fz = File.Create(path)) {
    networkStream.CopyTo(fz);
}

这里的另一种常见方法是将预期大小作为前缀发送给数据;这样,您就可以验证您是否拥有所需的数据。我个人不会使用这些信息在内存中创建一个正确大小的缓冲区,因为这仍然不允许使用史诗大小的文件(但是,
流是这样的)。

您是否可以显示发送和接收的不同数据?您是否尝试发送一小段已知字节(例如,新字节[]{1、2、3、4、5、6}或其他内容)然后与另一端的结果进行比较?它可能会为你指明正确的方向;e、 g.收到的尺寸是否更大?如果是这样的话,它是否与大文件一样大?您发送的模式是否出现在输出数据中的某个位置?等等,我正试图发送一个excel文件(1.65 MB),我收到一个5.12 MB的文件,我确信当我通过网络发送时字节数组出现问题,因为我在发送前检查了字节数组的大小,结果很好,在发送到服务器后又发生了变化;不确定您这样做是否有原因,但您可以这样做
byte[]fileData=File.ReadAllBytes(“pos.xls”)File.writealBytes(字符串路径,字节[]字节)调用。好的,我将尝试使用小字节样本,让您知道您是否可以显示发送和接收的不同数据。您是否尝试发送一小部分已知字节(例如新字节[]{1,2,3,4,5,6}或其他内容),然后与另一端的结果进行比较?它可能会为你指明正确的方向;e、 g.收到的尺寸是否更大?如果是这样的话,它是否与大文件一样大?您发送的模式是否出现在输出数据中的某个位置?等等,我正试图发送一个excel文件(1.65 MB),我收到一个5.12 MB的文件,我确信当我通过网络发送时字节数组出现问题,因为我在发送前检查了字节数组的大小,结果很好,在发送到服务器后又发生了变化;不确定您这样做是否有原因,但您可以这样做
byte[]fileData=File.ReadAllBytes(“pos.xls”)File.writealBytes(字符串路径,字节[]字节)调用。好的,我将尝试使用小样本字节,并让您知道谢谢,您的答案几乎有效,只有copyto似乎不存在于紧凑的框架中,因此我认为如果我自己编写该方法,它将有效,这不是很复杂,谢谢you@Tarik-在这种情况下,用一个小的缓冲区循环你得到了一些东西是的,事实上它最终起作用了,通过编写一个类似于CopyTo()的方法,再次感谢你,你的答案几乎起作用了,只有CopyTo似乎不存在于紧凑的框架中,所以我认为如果我自己编写这个方法,它会起作用,这不是很复杂,感谢you@Tarik-在这种情况下,使用一个小的缓冲区循环得到一些东西是的,事实上它最终起作用了,通过编写一个类似于CopyTo()的方法,再次感谢