c# - System.Argument 出现异常 :Specified argument was out of range of valid value

标签 c# winforms sockets client-server tcp

经过多次修复后,我仍然遇到一个严重的错误。我使用 VS2013 的开发人员命令提示符调试和运行我的服务器,并使用 VS 2013 运行客户端。

首先,我运行我的服务器没有任何问题,但是当我启动客户端时,将数据放入其中的文本框并单击发送时出现问题。

这是服务器端处理问题的代码。

IPAddress ipaddr=IPAddress.Parse("127.0.0.1");

TcpListener serverSocket = new TcpListener(ipaddr,8002);

int requestCount = 0;

TcpClient clientSocket = default(TcpClient);

serverSocket.Start();

Console.WriteLine(" >> Server Started");

clientSocket = serverSocket.AcceptTcpClient();

Console.WriteLine(" >> Accept connection from client");

requestCount = 0;

while ((true))
{
    try
    {
        requestCount = requestCount + 1;

        NetworkStream networkStream = clientSocket.GetStream();

        byte[] bytesFrom = new byte[10025];
        //issue stems out of here although i changed bytes size and tried too
        networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);

        string dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
        dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"));

        Console.WriteLine(" >> Data from client - " + dataFromClient);

        string serverResponse = "Last Message from client" + dataFromClient;

        Byte[] sendBytes = Encoding.ASCII.GetBytes(serverResponse);

        networkStream.Write(sendBytes, 0, sendBytes.Length);
        networkStream.Flush();

        Console.WriteLine(" >> " + serverResponse);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }
}

clientSocket.Close();
serverSocket.Stop();

Console.WriteLine(" >> exit");
Console.ReadLine();

编辑:经过建议,我改变了:

byte[] bytesFrom = new byte[10025];
networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);`

byte[] bytesFrom = new byte[clientSocket.ReceiveBufferSize];
networkStream.Read(bytesFrom, 0, bytesFrom.Length);  

结果给出了屏幕截图,但没有收到来自客户端的数据。

Screenshot

错误(来自命令提示符):-

Parameter name:size at System.Net.Sockets.NetworkStream.Read(byte[] buffer,int offset,int size)

at Console.Application1.Prog.Main():
System Argument Out of Exception:Specified Argument was out of range of valid value.

他们实际上调用的有效值是什么。

PS。如果我提供的代码太长,但这是需要的,请道歉

最佳答案

您应该将 receiveBuffer 大小指定为第三个参数,而不是 clientSocket.ReceiveBufferSize

networkStream.Read(bytesFrom, 0, bytesFrom.Length);

或者

使用 clientSocket.ReceiveBufferSize 创建缓冲区;

byte[] bytesFrom = new byte[clientSocket.ReceiveBufferSize];
networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);

这是来自微软的示例:

while(true) 
      {
        Console.Write("Waiting for a connection... ");

        // Perform a blocking call to accept requests.
        // You could also user server.AcceptSocket() here.
        TcpClient client = server.AcceptTcpClient();            
        Console.WriteLine("Connected!");

        data = null;

        // Get a stream object for reading and writing
        NetworkStream stream = client.GetStream();

        int i;

        // Loop to receive all the data sent by the client.
        while((i = stream.Read(bytes, 0, bytes.Length))!=0) 
        {   
          // Translate data bytes to a ASCII string.
          data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
          Console.WriteLine("Received: {0}", data);

          // Process the data sent by the client.
          data = data.ToUpper();

          byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);

          // Send back a response.
          stream.Write(msg, 0, msg.Length);
          Console.WriteLine("Sent: {0}", data);            
        }

        // Shutdown and end connection
        client.Close();
      }

关于c# - System.Argument 出现异常 :Specified argument was out of range of valid value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27578650/

相关文章:

c# - 如何在用户单击列标题时启用 DataGridView 排序?

c - 通过c中的套接字传递wav文件样本

C# 程序在 Socket.Accept() 上挂起

c# - 在 WCF SOAP API 中使用 HTTP 授权 header 进行身份验证

c# - 无法将类型为 'System.Random' 的对象转换为类型 'System.IConvertible'

c# - 路径动画

c# - 给定范围列表找到最大重叠范围的有效算法

c# - InvalidArgument= '0' 的值对于 'SelectedIndex' 无效。参数名称 : SelectedIndex

c# - c# Windows 应用程序中的线程

java - 使用套接字编写 Java 程序以连接到 PLC(可编程逻辑 Controller )