3

如下面的简化代码所示,检查 SendAsync() 是否已完成缓冲区中所有预期字节的传输是正确的做法吗?还是那是多余的?这是一个 TCP 连接套接字。我特别担心必须在 ProcessSend() 中对 SendAsync() 发出第二次子调用。

例如,如果我有多个线程使用新的(池化的)SocketAsyncEventArg 为每条消息向客户端传输数据,那么同时发送是否可能会在部分传输的消息之间插入自身?或者这是通过仅允许在数据发送中使用一个 SocketAsyncEventArg 来控制对客户端的访问的一个很好的理由?

private void ProcessSend(SocketAsyncEventArgs e)
{
    // Check that data was sent
    if ((e.SocketError == SocketError.Success) && (e.BytesTransferred > 0))
    {
        AsyncSendUserToken token = (AsyncSendUserToken)e.UserToken;

        // Check that all the data was sent
        int offset = e.Offset + e.BytesTransferred;
        if (offset < e.Count)
        {
            // Call send again to finish the send
            e.SetBuffer(offset, e.Count - offset);
            bool _willRaiseEvent = token.Socket.SendAsync(e);
            if (!_willRaiseEvent)
                ProcessSend(e);
        }
    }
}
4

2 回答 2

2

我怀疑您正在阅读http://msdn.microsoft.com/en-us/library/system.net.sockets.socketasynceventargs.aspx上的示例,并看到他们正在检查 ProcessReceive 的字节长度。

这样做是为了获取所有接收到的字节,因为您无法控制每次从对方发送多少字节。

当您执行发送时,这是多余的,因为框架会为您处理发送所有数据。

于 2009-12-21T08:10:41.553 回答
1

我认为您的代码有问题:

// Check that all the data was sent
int offset = e.Offset + e.BytesTransferred;
if (offset < e.Count)
{

e.Count 是要传输的字节数,它不是字节数组的偏移量。

所以,为了比较苹果和苹果,你会说:

if (e.BytesTransfered < e.Count) { }

于 2011-05-15T02:01:40.167 回答