如下面的简化代码,检查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);
}
}
}
答案 0 :(得分:2)
我怀疑你正在http://msdn.microsoft.com/en-us/library/system.net.sockets.socketasynceventargs.aspx阅读这个例子并看到他们正在检查ProcessReceive上的字节长度。
这样做是为了获取所有接收的字节,因为您无法控制每次从另一方发送的字节数。
当您执行发送时,这是多余的,因为框架会处理为您发送所有数据。
答案 1 :(得分:1)
我认为您的代码存在问题:
// Check that all the data was sent
int offset = e.Offset + e.BytesTransferred;
if (offset < e.Count)
{
e.Count是要传输的字节数,它不是字节数组的偏移量。
所以,为了比较苹果和苹果,你会说:
if(e.BytesTransfered&lt; e.Count) { }