c# - 即使我的服务器套接字已收到所有字节,为什么 SendAsync 不会在 SocketAsyncEventArgs 上引发 Completed 事件?

标签 c# sockets asynchronous sendasync

所以我有一个非常简单的设置:WAITING客户端连接的服务器和连接到服务器并发送消息的客户端。服务器随后应再次发送回相同的消息。但是,当我尝试使用 client.SendAsync(sendArgs) 发送消息时,它实际上并没有调用 sendArgs 对象上的 Completed 事件,即使我可以看到我的服务器套接字已经收到了所有字节。那么为什么我的Client-Socket中的sendArgs.Completed没有被引发,但我的receiveArgs.Completed strong>服务器套接字类?

使用的命名空间:System、System.Net、System.Net、System.Text

这是我到目前为止的代码:

客户端

public class SocketClient
{
    public IPEndPoint Endpoint { get; }

    private Socket client;

    public SocketClient(IPAddress address, int port)
    {
        Endpoint = new IPEndPoint(address, port);
        client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    }

    public void ConnectToServer(IPAddress serverAddress, int serverPort)
    {
        client.Bind(Endpoint);

        try
        {
            client.Connect(serverAddress, serverPort);
        }
        catch (SocketException)
        {
            return;
        }
    }

    public void SendMessage(string message)
    {
        SocketAsyncEventArgs sendArgs = new SocketAsyncEventArgs();
        byte[] buffer = Encoding.ASCII.GetBytes(message);
        sendArgs.SetBuffer(buffer, 0, buffer.Length);
        sendArgs.Completed += SendArgs_Completed;
        client.SendAsync(sendArgs);
    }

    private void SendArgs_Completed(object sender, SocketAsyncEventArgs e)
    {
        SocketAsyncEventArgs receiveArgs = new SocketAsyncEventArgs();
        byte[] buffer = new byte[1024];
        receiveArgs.SetBuffer(buffer, 0, buffer.Length);
        receiveArgs.Completed += ReceiveArgs_Completed;
        client.ReceiveAsync(receiveArgs);
    }

    private void ReceiveArgs_Completed(object sender, SocketAsyncEventArgs e)
    {
        string message = Encoding.ASCII.GetString(e.Buffer);
        Console.WriteLine(message);
    }
}

服务器

public class SocketServer
{
    public IPEndPoint Endpoint { get; }

    private Socket server;

    public SocketServer(IPAddress address, int port)
    {
        Endpoint = new IPEndPoint(address, port);
        server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    }

    public void Start()
    {
        server.Bind(Endpoint);
        server.Listen(10);

        SocketAsyncEventArgs acceptArgs = new SocketAsyncEventArgs();
        acceptArgs.Completed += AcceptArgs_Completed;
        server.AcceptAsync(acceptArgs);
    }

    private void AcceptArgs_Completed(object sender, SocketAsyncEventArgs e)
    {
        Socket connectionSocket = e.AcceptSocket;

        SocketAsyncEventArgs receiveArgs = new SocketAsyncEventArgs();
        byte[] buffer = new byte[1024];
        receiveArgs.SetBuffer(buffer, 0, buffer.Length);
        receiveArgs.Completed += ReceiveArgs_Completed;
        connectionSocket.ReceiveAsync(receiveArgs);

        e.AcceptSocket = null;
        server.AcceptAsync(e);
    }

    private void ReceiveArgs_Completed(object sender, SocketAsyncEventArgs e)
    {
        Socket connectionSocket = (Socket)sender;

        SocketAsyncEventArgs sendArgs = new SocketAsyncEventArgs();
        sendArgs.SetBuffer(e.Buffer, 0, e.Buffer.Length);
        connectionSocket.SendAsync(sendArgs);

        connectionSocket.ReceiveAsync(e);
    }
}

最佳答案

编辑:我修好了。我缺少的是检查 SendAsync 方法是否已同步或异步完成。如果它同步完成,我需要自己调用该事件

bool completedAsync = client.SendAsync(sendArgs);
if(!completedAsync)
{
    SendArgs_Completed(this, sendArgs);
}

关于c# - 即使我的服务器套接字已收到所有字节,为什么 SendAsync 不会在 SocketAsyncEventArgs 上引发 Completed 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51661223/

相关文章:

c# - 无法让 log4net 使用 .net Windows 服务

c# - 偶尔从 X509Certificate2 获取私钥时出现异常 "Invalid Provider type specified"或 "Key does not exist"

java:读写操作上的单个套接字。全双工

javascript - Node.js 异步并行不工作应该如何?

python - 在 Tornado 中没有收到所有命名管道输出

c# - 搜索 RichTextBox 并突出显示该特定单词的所有实例的方法

c# - 在 C# 中是否可以使用内部 AND protected 成员?

c# - 如何根据当前服务器找到最适合读取或写入 Stream 的缓冲区大小

java - Java 中 RH Linux 和 Solaris 之间的 TCP 性能差异?

AngularJS。在服务中解决 promise 后如何更新指令?