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

使用TCP Socket的SendAsync异步发送字节数据报错问题排查

解决Socket.SendAsync参数类型不匹配的问题

错误原因

你遇到的报错核心是:Socket类的SendAsync有多个重载版本——同步的Send方法支持直接传入byte[],但你当前调用的异步重载需要的是SocketAsyncEventArgs类型参数,传入byte[]自然会出现类型不兼容的错误。

两种解决方案

方案1:使用基于Task的SendAsync重载(推荐)

在.NET Core/.NET 5及以上版本中,Socket提供了更简洁的Task异步重载,直接支持传入byte[]和SocketFlags,修改代码如下:

IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 8888);
using Socket tcpListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
    tcpListener.Bind(endPoint);
    tcpListener.Listen();
    Console.WriteLine("Server is currently running, waiting for incoming connections");
    while (true)
    {
        using var tcpClient = await tcpListener.AcceptAsync();
        var data = MessagePackSerializer.Serialize(DateTime.Now.ToLongTimeString());
        // 传入SocketFlags参数,使用Task异步重载
        await tcpClient.SendAsync(data, SocketFlags.None);
        Console.WriteLine($"Client: {tcpClient.RemoteEndPoint} received their data");
    }
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
}

方案2:使用SocketAsyncEventArgs(传统异步模式)

如果需要更精细的控制(比如复用缓冲区、跟踪传输进度),可以用传统的SocketAsyncEventArgs方式实现:

// 替换原发送逻辑
var args = new SocketAsyncEventArgs();
args.SetBuffer(data, 0, data.Length);
// 频繁发送场景建议复用SocketAsyncEventArgs以减少内存分配
await tcpClient.SendAsync(args);

额外提示

原代码中Server is currently run存在语法错误,应改为Server is currently running。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 08:45:28