异步/等待套接字连接中的竞争条件

吉姆

此send方法将定期失败,因为控制权已返回给调用线程,并Send在套接字打开时再次被调用。

我正在使用Stephen Toub的课程:http : //blogs.msdn.com/b/pfxteam/archive/2011/12/15/10248293.aspx

这将导致异常:在已连接的套接字上发出了连接请求。
确保异步方法不会遭受这种命运的正确方法是什么?基本上,发送实际上无法在建立连接之前完成。

    public async Task Send(byte[] tosend)
    {
        // this code is not correct / not thread safe.
        if (this.socket.Connected)
            await this.StartSending(tosend);
        else
            await StartConnecting(tosend);
    }

    private async Task StartSending(byte[] tosend)
    {
        var args = new SocketAsyncEventArgs();
        args.SetBuffer(tosend, 0, tosend.Length);
        var awaitable = new SocketAwaitable(args);
        await this.socket.SendAsync(awaitable);
    }

    private async Task StartConnecting(byte[] tosend)
    {
        var local = Dns.GetHostEntry(Dns.GetHostName());
        var ep = new IPEndPoint(local.AddressList.First(_ => _.AddressFamily == AddressFamily.InterNetwork), this.port);
        var args = new SocketAsyncEventArgs() { RemoteEndPoint = ep };
        var awaitable = new SocketAwaitable(args);
        await this.socket.ConnectAsync(awaitable);
        await StartSending(tosend);
    }

我的测试Send连续非常快地打电话给我

var sends = arrays.Select(_ => writer.Send(_)).ToArray();
Task.WaitAll(sends);

有时,上面的代码可以正常工作,并且套接字已连接,socket.Connected设置为true“ on time”。在其他时候,多次调用会this.socket.ConnectAsync发生。

大卫·普费弗

Send应该等待对的调用,以便您知道已建立连接,也要知道您的数据是按顺序发送的。最好由foreach循环处理而不是.Select

foreach (var data in arrays)
    await writer.Send(data);

大概您创建了变量,sends以便可以Task.WhenAll对其进行操作。不幸的是,由于您已经发现的原因,这将不起作用。你可能有所谓的一个单独的方法解决这个问题Connect是异步-LY连接到远程主机但没有发送数据。然后,您可以执行以下操作:

await writer.Connect();
var sends = arrays.Select(_ => writer.Send(_)).ToArray();

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

异步/等待套接字连接中的竞争条件

来自分类Dev

套接字等待连接超时

来自分类Dev

Boost Asio异步连接竞争条件?

来自分类Dev

TCP套接字连接中同步与异步的优势

来自分类Dev

使用C的TCP套接字中的人为延迟,用于竞争条件开发

来自分类Dev

D中的异步套接字

来自分类Dev

Linux中的套接字连接

来自分类Dev

异步网络竞争条件

来自分类Dev

是否有基于TPL(异步/等待)的套接字抽象?

来自分类Dev

在Python异步中检测套接字EOF

来自分类Dev

任务中的异步套接字操作

来自分类Dev

TCP客户端套接字。连接并等待输入流

来自分类Dev

检查是否有任何套接字连接正在等待(python)

来自分类Dev

Discord.js等待网络套接字连接

来自分类Dev

发送命令后使套接字连接等待响应

来自分类Dev

C#(套接字)在 x 秒内等待连接

来自分类Dev

Python套接字等待客户端连接

来自分类Dev

等待套接字操作

来自分类Dev

异步C ++套接字

来自分类Dev

异步套接字混乱

来自分类Dev

在Android中连接和断开套接字

来自分类Dev

Java中的密钥SSL套接字连接

来自分类Dev

在Python中打开SSL套接字连接

来自分类Dev

OpenShift中的网络套接字连接

来自分类Dev

连接中的Lua套接字错误

来自分类Dev

iOS:在套接字中读写(TCP连接)

来自分类Dev

在Android中连接和断开套接字

来自分类Dev

C中的队列套接字连接

来自分类Dev

连接中未定义的套接字