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# 指定的参数超出了有效值的范围。参数名称:size&;串口通信_C#_Sockets_Serial Port_Windows Ce - Fatal编程技术网

C# 指定的参数超出了有效值的范围。参数名称:size&;串口通信

C# 指定的参数超出了有效值的范围。参数名称:size&;串口通信,c#,sockets,serial-port,windows-ce,C#,Sockets,Serial Port,Windows Ce,我需要创建一个需要使用TCP/IP与现有软件通信的应用程序,其中我的应用程序和其他应用程序都将使用下面指定的端口号 private void frmScan_Load(object sender, EventArgs e) { clientSocket.Connect("100.100.100.30", 76545); } public void msg(string mesg) { textBox1.Text = textBox1.Text + Environment.New

我需要创建一个需要使用TCP/IP与现有软件通信的应用程序,其中我的应用程序和其他应用程序都将使用下面指定的端口号

private void frmScan_Load(object sender, EventArgs e)
{
    clientSocket.Connect("100.100.100.30", 76545);
}

public void msg(string mesg)
{
    textBox1.Text = textBox1.Text + Environment.NewLine + " >> " + mesg;
}

private void cmdSCANok_Click(object sender, EventArgs e)
{

    msg("Client Started");
    NetworkStream serverStream = clientSocket.GetStream();
    byte[] outStream = Encoding.ASCII.GetBytes("PCK|SCAN|5025066840471");

    serverStream.Write(outStream, 0, outStream.Length);
    serverStream.Flush();

    byte[] inStream = new byte[10025];
    serverStream.Read(inStream, 0, (int)clientSocket.ReceiveBufferSize);
    string returndata = Encoding.ASCII.GetString(inStream, 0, inStream.Length);


    msg("Data from Server : " + returndata);
} 
发生的情况是,我正在与之通信的程序有一些内置语言,它将理解我发送的代码,并根据我发送的代码返回数据。因此,在上面的代码中,我发送了三位代码:(
“PCK | SCAN | 502506684071”
),它将在数据库中查找特定项。当它运行时,我在线路上得到一个错误:

serverStream.Read(inStream, 0, (int)clientSocket.ReceiveBufferSize);
错误显示如下: “指定的参数超出了有效值的范围。 参数名称:大小“

我遵循了我在这个网站上看到的教程:-但我做了一点不同。因此,与其把

string returndata = Encoding.ASCII.GetString(inStream);
我写道:

string returndata = Encoding.ASCII.GetString(inStream, 0, inStream.Length); 
我对我为什么会遇到这些问题感到非常困惑,老实说,我不太了解代码在做什么,我只是有一个粗略的想法,但还不足以解决这个问题。有人能帮忙吗

非常感谢


PS:我正在Visual Studio 2010上为Windows CE(便携式设备)编程。

您的代码是如何不进行TCP通信的一个很好的示例。我已经多次看到这段代码被复制,我很高兴为您介绍一个关于TCP的好教程——可惜我还没有看到:)

让我先指出一些错误:

  • TCP不能保证数据包以一组字节的形式到达。因此(理论上)写入操作可能导致拆分,需要在另一侧进行两次读取。通过TCP发送不带报头的数据是一个非常糟糕的主意——接收方不知道需要读取多少数据。因此,您有两种选择—要么在数据本身之前写入整组数据的长度,要么使用控制字符结束“数据包”
  • 第一点也应该澄清你的阅读也是错误的。读取整个“命令”可能需要多次读取操作,或者一次读取操作可能会同时给出两个命令
  • 您正在将
    ReceiveBufferSize
    字节读入
    10025
    长缓冲区
    ReceiveBufferSize
    可能大于您的缓冲区。不要这样做-读取最大计数
    inStream.Length
    。如果你在C++中编码,这将是缓冲区溢出的一个很好的例子。
  • 当您将数据转换为字符串时,您希望整个缓冲区都已满。很可能不是这样。相反,您必须存储read调用的返回值——它告诉您实际读取了多少字节。否则,您将读取垃圾,并且基本上会出现另一个缓冲区溢出
因此,一个更好的(尽管还远远不够完美)实现是这样的:

NetworkStream serverStream = clientSocket.GetStream();
byte[] outStream = Encoding.ASCII.GetBytes("PCK|SCAN|5025066840471");

// It would be much nicer to send a terminator or data length first, 
// but if your server doesn't expect that, you're out of luck.
serverStream.Write(outStream, 0, outStream.Length);

// When using magic numbers, at least use nice ones :)
byte[] inStream = new byte[4096];

// This will read at most inStream.Length bytes - it can be less, and it
// doesn't tell us how much data there is left for reading.
int bytesRead = serverStream.Read(inStream, 0, inStream.Length);

// Only convert bytesRead bytes - the rest is garbage
string returndata = Encoding.ASCII.GetString(inStream, 0, bytesRead);
哦,我得推荐一下

它讨论了许多关于TCP的误解,最重要的是查看消息框架部分。

NetworkStream.Read方法包含以下检查:

if(size < 0 || size > (buffer.Length - offset))
   throw new ArgumentOutOfRanveException("size");
您收到的错误表示clientSocket.ReceiveBufferSize>inStream.Length。换句话说,您正试图读取比可用字节更多的字节。请尝试使用以下代码:

...
var count = serverStream.Read(inStream, 0, inStream.Length);
string returndata = Encoding.ASCII.GetString(inStream, 0, count);

另请参见一个示例。

可能clientSocket.ReceiveBufferSize大于serverStream.Length?这个问题与串行端口有什么关系?我很好奇,您是否在Visual Studio 2010上创建了SmartDevice项目??我很想知道你是怎么做到的,76545端口?听起来很有趣:)
...
var count = serverStream.Read(inStream, 0, inStream.Length);
string returndata = Encoding.ASCII.GetString(inStream, 0, count);