You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WindowsForms聊天服务器ReceiveAsync/SendAsync参数错误修复

Socket ReceiveAsync/SendAsync 参数无效问题修复

问题原因

你遇到的参数无效错误,核心原因是直接向ReceiveAsync和SendAsync传递byte[]数组不符合方法的参数要求。.NET中Socket的这两个异步方法,需要接收ArraySegment<byte>或Memory<byte>类型的参数,而非原始的byte[]。

修复方案

将传递的字节数组包装为ArraySegment<byte>(兼容所有.NET版本)或Memory<byte>(.NET Core/.NET 5+推荐)即可解决问题。

修改后的Server.cs代码

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

public class HostInformationFetcherServer
{
    public async Task<IPHostEntry> GetHostEntryAsync()
    {
        try
        {
            string hostName = Dns.GetHostName();
            IPHostEntry ipEntry = await Dns.GetHostEntryAsync(hostName);
            IPAddress ip = ipEntry.AddressList[0];
            IPEndPoint iPEndPoint = new IPEndPoint(ip, 1234);

            Socket server = new Socket(
                iPEndPoint.AddressFamily,
                SocketType.Stream,
                ProtocolType.Tcp
            );

            server.Bind(iPEndPoint);
            server.Listen(10);
            Console.WriteLine("Server started Listening on port: 1234");

            var handler = await server.AcceptAsync();

            while (true)
            {
                byte[] buffer = new byte[1024];
                // 修复:将byte[]包装为ArraySegment<byte>
                var received = await handler.ReceiveAsync(new ArraySegment<byte>(buffer), SocketFlags.None);

                var messageString = Encoding.UTF8.GetString(buffer, 0, received);
                if (!string.IsNullOrEmpty(messageString))
                {
                    Console.WriteLine("Message from client: {0}", messageString);
                    var response = "Message Received!";
                    var responseByte = Encoding.UTF8.GetBytes(response);
                    // 修复:将byte[]包装为ArraySegment<byte>
                    await handler.SendAsync(new ArraySegment<byte>(responseByte), SocketFlags.None);
                }
            }
        }
        catch (System.Exception ex)
        {
            Console.WriteLine($"An error occurred: {ex.Message}");
            return null;
        }
    }
}

修改后的Client.cs代码

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

public class HostInformationFetcherClient
{
    public async Task<IPHostEntry> GetHostEntryAsync()
    {
        try
        {
            string hostName = Dns.GetHostName();
            IPHostEntry ipEntry = await Dns.GetHostEntryAsync(hostName);
            IPAddress ip = ipEntry.AddressList[0];
            IPEndPoint iPEndPoint = new IPEndPoint(ip, 1234);
            
            Socket client = new Socket(
                iPEndPoint.AddressFamily,
                SocketType.Stream,
                ProtocolType.Tcp
            );

            await client.ConnectAsync(iPEndPoint);

            while (true)
            {
                Console.Write("Send A Message:");
                var message = Console.ReadLine();
                if (string.IsNullOrEmpty(message)) continue;

                var messageBytes = Encoding.UTF8.GetBytes(message);
                // 修复:将byte[]包装为ArraySegment<byte>
                await client.SendAsync(new ArraySegment<byte>(messageBytes), SocketFlags.None);

                var buffer = new byte[1024];
                // 修复:将byte[]包装为ArraySegment<byte>
                var received = await client.ReceiveAsync(new ArraySegment<byte>(buffer), SocketFlags.None);
                
                // 可选:打印服务器响应
                var response = Encoding.UTF8.GetString(buffer, 0, received);
                Console.WriteLine("Server response: {0}", response);
            }
        }
        catch (System.Exception ex)
        {
            Console.WriteLine($"An error occurred: {ex.Message}");
            return null;
        }
    }
}

额外说明

  • 如果使用的是.NET Core 3.0+或.NET 5+,也可以用Memory<byte>替代ArraySegment<byte>,写法更简洁:await handler.ReceiveAsync(buffer.AsMemory(), SocketFlags.None);
  • 原代码中messageString != null的判断不够严谨,改为!string.IsNullOrEmpty可避免空字符串导致的无效处理逻辑。

内容的提问来源于stack exchange,提问作者WANderer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 09:43:23