gpt4 book ai didi

c# - 异步TCP套接字的怪异行为

转载 作者:行者123 更新时间:2023-12-03 11:58:10 25 4
gpt4 key购买 nike

我有一个异步服务器套接字监听某些端口。然后从另一台PC,我连接到服务器并发送1个字节。一切正常,但是有一个奇怪的行为。当我拉出网络电缆并尝试发送1个字节(在os意识到电缆被拉出之前)时,我没有收到任何异常/错误,并且服务器没有收到该数据包。这是套接字应该如何工作的吗?这是否意味着在连接丢失的情况下,某些数据包可能会丢失(因为我没有得到异常并且不知道请求没有发送)?
这是代码:

    private void button3_Click(object sender, EventArgs e)
{
var b = new byte[1] {1};
client.BeginSend(b, 0, b.Length, 0, new AsyncCallback(SendCallback), client);
}

private void SendCallback(IAsyncResult ar)
{
Socket client = (Socket)ar.AsyncState;

int bytesSent = client.EndSend(ar);

this.Invoke(new MethodInvoker(() => { MessageBox.Show(bytesSent.ToString() + " bytes sent"); }));
}

最佳答案

套接字层的Windows在内核处维护套接字缓冲区。在应用程序层上成功发送仅意味着将数据复制到内核缓冲区中。该缓冲区中的数据由TCP堆栈推送到远程应用程序。在Windows中,如果数据包被丢弃,TCP将重新发送数据3次,然后TCP堆栈将通知应用程序附近的连接。重试之间的间隔由RTT决定。第一次重试在1 * RTT之后,第二次在2 * RTT之后,第三次在3 * RTT之后。在您的情况下,您发送的1个字节仅被复制到内核缓冲区中并表示成功。需要3 * RTT指示 socket 已关闭。仅当您调用任何套接字API或监视套接字的关闭事件时,才会通知此连接关闭。拔出电缆后,如果恰好在3 * RTT之后排队第二次发送,则发送应通过异常。立即获得发送失败指示的另一种方法是将发送套接字缓冲区的大小设置为零(SetSocketOption(..,SendBuffer,..)),以便TCP堆栈直接使用您的缓冲区并立即指示失败。

关于c# - 异步TCP套接字的怪异行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23995095/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com