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
相关产品推荐
相关产品推荐

