Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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# System.Drawing.ImageFromStream处的System.ArgumentException_C#_Sockets_Bitmap_Memorystream - Fatal编程技术网

C# System.Drawing.ImageFromStream处的System.ArgumentException

C# System.Drawing.ImageFromStream处的System.ArgumentException,c#,sockets,bitmap,memorystream,C#,Sockets,Bitmap,Memorystream,好的,我看到很多人都有这个问题,我在某种程度上找到了导致这个问题的原因,但我不知道如何解决它。基本上,我试图通过套接字将屏幕截图从客户端发送到服务器。我在客户端应用程序上截图,并使用此方法将其转换为字节数组: // Convert bitmap to byte method public static byte[] ImageToByte(Bitmap bitmap) { byte[] imageData; using (var stream = new MemoryStream

好的,我看到很多人都有这个问题,我在某种程度上找到了导致这个问题的原因,但我不知道如何解决它。基本上,我试图通过套接字将屏幕截图从客户端发送到服务器。我在客户端应用程序上截图,并使用此方法将其转换为字节数组:

// Convert bitmap to byte method
public static byte[] ImageToByte(Bitmap bitmap)
{
    byte[] imageData;
    using (var stream = new MemoryStream())
    {
        bitmap.Save(stream, ImageFormat.Png);
        imageData = stream.ToArray();
        return imageData;
    }
}
然后我将字节数组的长度和字节数组发送到服务器。服务器在接收到长度后,使用此方法获取实际数据(这是该方法的一部分,因为大部分数据不相关):

我总是从
System.Drawing.ImageFromStream
获得
System.ArgumentException
:“参数无效”。这段代码可以很好地发送字符串,但每当我尝试发送图像时,它就不起作用了。我非常确定这是套接字代码的问题,因为我尝试在本地执行此操作,拍摄了一个屏幕截图,使用相同的方法将其转换为字节数组,然后使用相同的方法将其转换回,结果成功了。有人知道我的代码有什么问题吗

下面是缓冲区的部分代码

struct RecBuffer 
{ 
   public const int BUFFER_SIZE = 1024;
   public byte[] buffer;
   public int toRecieve;
   public MemoryStream bufStream;

   public RecBuffer(int toRec) 
   {
      buffer = new byte[BUFFER_SIZE];
      toRecieve = toRec;
      bufStream = new MemoryStream(toRecieve);
   }
}

我使用了相当多的代码。至少对于接收部件。

我认为问题在于您的
datareceivecallback
函数。 在这里,您可以将bufStream的位置重置为零:

if (recieveBuffer.toRecieve > 0)
{
  Array.Clear(recieveBuffer.buffer, 0, recieveBuffer.buffer.Length);
  recieveBuffer.bufStream.Position = 0; // <--Here
  sck.BeginReceive(recieveBuffer.buffer, 0, recieveBuffer.buffer.Length, SocketFlags.None, dataRecieveCallback, null);
  return;
}

您的代码应该可以正常工作。

我认为问题在于您的
datareceivecallback
函数。 在这里,您可以将bufStream的位置重置为零:

if (recieveBuffer.toRecieve > 0)
{
  Array.Clear(recieveBuffer.buffer, 0, recieveBuffer.buffer.Length);
  recieveBuffer.bufStream.Position = 0; // <--Here
  sck.BeginReceive(recieveBuffer.buffer, 0, recieveBuffer.buffer.Length, SocketFlags.None, dataRecieveCallback, null);
  return;
}

您的代码应该可以正常工作。

是否调试了finalBuffer字节[],并查看它们是否与源字节[]匹配?至少可以比较长度和第一个字节。你的接收方法看起来很奇怪。这个ReceiveBuffer是什么类型的类?对不起,我应该发布更多的代码。ReceiveBuffer的代码如下所示:
struct RecBuffer{public const int BUFFER_SIZE=1024;public byte[]BUFFER;public int toRecieve;public MemoryStream bufStream;public RecBuffer(int toRec){BUFFER=new byte[BUFFER_SIZE];toRecieve=toRec;bufStream=newmemoryStream(toRecieve);}
我用了很多这样的代码:我把这段代码放在你原来的帖子里。这样它就不能被正确读取。那么你检查过接收字节了吗[]已经?是的,对不起。我不习惯这种格式。如果你从这个家伙那里得到了代码,那么你为什么不调试代码来找到错误呢?我认为我们不能用整个代码的这个短截图来完成这项工作。你调试了finalBuffer字节[]并查看它们是否与源字节[]匹配吗?至少长度和第一个字节可以比较。你的接收方法看起来很奇怪。这个ReceiveBuffer是什么类型的类?对不起,我应该发布更多的代码。ReceiveBuffer的代码如下:
struct RecBuffer{public const int BUFFER_SIZE=1024;public byte[]buffer;public int-toRecieve;public MemoryStream bufStream;public RecBuffer(int-toRec){buffer=new byte[buffer_SIZE];toRecieve=toRec;bufStream=new MemoryStream(toRecieve);}
我用了很多这样的代码:我把这些代码放在你原来的帖子里。这样它就不能被正确读取。那么你检查接收字节了吗[]已经?是的,对不起。我不习惯这种格式。如果你从这个家伙那里得到了代码,那么你为什么不调试代码来找到错误呢?我不认为我们可以在这里用这个简短的剪贴画来完成这项工作。非常感谢!我觉得没有删除它太愚蠢了,我在示例代码中基于了这个o的一部分ff,我只是没怎么想。@user1742916:不客气!请点击投票箭头下方的空心复选标记来接受我的答案。非常感谢!我觉得没有删除它太愚蠢了,我只是在示例代码中基于这一部分,我只是没怎么想。@user1742916:不客气!请接受我的回答通过单击投票箭头下方的空心复选标记进行投票。
if (recieveBuffer.toRecieve > 0)
{
  Array.Clear(recieveBuffer.buffer, 0, recieveBuffer.buffer.Length);
  recieveBuffer.bufStream.Position = 0; // <--Here
  sck.BeginReceive(recieveBuffer.buffer, 0, recieveBuffer.buffer.Length, SocketFlags.None, dataRecieveCallback, null);
  return;
}
recieveBuffer.bufStream.Position = 0;