gpt4 book ai didi

c# - Socket.EndReceive 工作流程

转载 作者:可可西里 更新时间:2023-11-01 02:50:07 28 4
gpt4 key购买 nike

关于 microsoft site您可以找到 ReadCallback(IAsyncResult)

的代码
static void ReadCallback(IAsyncResult ar)
{
StateObject state = (StateObject)ar.AsyncState;
Socket handler = state.workSocket;

int read = handler.EndReceive(ar);

if(read > 0)
{
state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, read));
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state);
}
else
{
if(state.sb.Length > 1)
{
string content = state.sb.ToString();

Console.WriteLine($"Read {content.Length} bytes from socket. \nData: {content}");
}
handler.Close();
}
}

我不清楚的是这个 if/else 语句。如果我们已经阅读了一些内容,为什么还要再次 BeginReceive

我们为什么不做

static void ReadCallback(IAsyncResult ar)
{
StateObject state = (StateObject)ar.AsyncState;
Socket handler = state.workSocket;

int read = handler.EndReceive(ar);

state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, read));

if(state.sb.Length > 1)
{
string content = state.sb.ToString();

Console.WriteLine($"Read {content.Length} bytes from socket. \nData: {content}");
}
handler.Close();
}

最佳答案

基本上,因为部分消息是一回事。

例如,如果您发送 1000 个字节,那么第一个接收实际上可能只收到 30 个。然后下一个收到 70 个,下一个收到 100 个,然后是 50 个,然后是 150 个,等等,直到收到所有 1000 个字节(显然现代网络的数字会更高)。这就是为什么大多数 TCP 消息都有某种结束标记,或者它们以它们的大小为前缀:所以你知道它们何时完成。

请记住:即使您请求 100 个字节,EndReceive 也会最多给您那么多字节。它不一定要等到所有这些都拥有。

关于c# - Socket.EndReceive 工作流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54169247/

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