gpt4 book ai didi

c# - Socket.Receive 什么时候返回数据?

转载 作者:可可西里 更新时间:2023-11-01 08:43:37 25 4
gpt4 key购买 nike

又是初学者问题:有点像我不久前提出的问题的跟进。

我正在尝试理解这个同步套接字教程 http://msdn.microsoft.com/en-us/library/6y0e13d3.aspx ,尤其是下面代码中的一行。

问题:我想确保我正确理解程序流程。 什么时候 handler.Receive(bytes) 返回?当它“溢出”并接收到超过 1024 字节时,它是否返回并存储接收到的字节数在 int bytesRec** 中? **如果是这样的话,这听起来可能很愚蠢,如果在 *data* 变量中存储 1024 个字节而不是监听更多字节时到达更多字节会发生什么那可能会在那个时候到达?还是我不应该担心,让 .net 来处理?

Socket handler = listener.Accept();
data = null;

// An incoming connection needs to be processed.
while (true) {
bytes = new byte[1024];
int bytesRec = handler.Receive(bytes);
// My question is WHEN does the following line
// get to be executed
data += Encoding.ASCII.GetString(bytes,0,bytesRec);
if (data.IndexOf("<EOF>") > -1) {
break;
}
}

最佳答案

When does handler.Receive(bytes) return?

文档:

If no data is available for reading, the Receive method will block until data is available, unless a time-out value was set by using Socket.ReceiveTimeout. If the time-out value was exceeded, the Receive call will throw a SocketException. If you are in non-blocking mode, and there is no data available in the in the protocol stack buffer, the Receive method will complete immediately and throw a SocketException. You can use the Available property to determine if data is available for reading. When Available is non-zero, retry the receive operation.


Does it return and store the number of bytes received in int bytesRec when it "overflows" and has received more than 1024 bytes?

不,它总是返回已读取的字节数。如果没有,您怎么知道 bytes 的哪些部分包含有意义的数据以及哪些部分未被使用?

了解套接字的典型工作方式非常重要:字节可能以数据包的形式到达,但就接收方而言,每个字节都应独立考虑。这意味着不能保证您将获得发送方发送的 block 中的字节,当然也不能保证有足够的数据来填满您的缓冲区。

如果您只想处理 1024 字节 block 中的传入数据,您有责任继续调用 Receive 直到它向您释放总共 1024 字节。

And if that is so, and this might sound silly, what happens if MORE bytes arrive as it is storing the 1024 bytes in the variable and not listening for more bytes that might be arriving at that time?

让我们重申,Receive 不会在缓冲区中存储 1024 字节,因为那是缓冲区的大小。它将存储最多 1024 字节。

如果网络堆栈内部缓冲的数据多于您的缓冲区可以容纳的数据,那么 1024 字节将返回给您,其余的将保留在网络堆栈的缓冲区中,直到您再次调用 Receive .如果 Receive 已经开始将数据复制到您的缓冲区,并且此时从网络接收到更多数据,那么很可能会发生的情况是这些数据必须等待下一个 Receive调用。

毕竟,在任何时候都没有人保证 Receive 会为您提供所有它所能提供的数据(尽管这当然是可取的,而且确实发生了大多数时候)。

关于c# - Socket.Receive 什么时候返回数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15523976/

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