Tag: sockets

Python的socket.recv()返回非阻塞套接字是什么,如果没有数据收到直到发生超时?

基本上,我已经读了几个地方, socket.recv()将返回任何它可以读取,或者一个空string,表明另一方已经closures(官方文档甚至没有提到什么时候连接是什么closures…太棒了!)。 因为我们知道recv()只有在实际有东西需要接收的时候才会返回,所以当它返回一个空string时,它必须意味着另一端已经closures了连接,对吗? 好的,好吧,但是当我的套接字是非阻塞时呢? 我已经search了一下(也许还不够,谁知道?),并不知道如何判断对方何时使用非阻塞套接字来closures连接。 似乎没有方法或属性告诉我们这一点,比较recv()的返回值与空string似乎是绝对无用的…是只有我有这个问题? 作为一个简单的例子,假设我的套接字的超时设置为1.2342342(无论你在这里是否定的非负数)秒,我打电话给socket.recv(1024) ,但另一方在1.2342342秒期间不发送任何东西。 recv()调用将返回一个空string,我不知道连接是否仍然存在或没有线索…

如何将TCP套接字更改为非阻塞?

你如何使一个套接字非阻塞? 我知道fcntl()函数,但我听说它并不总是可靠的。

在同一个套接字上并行调用send / recv是否有效?

我们可以调用从一个线程发送和从另一个在同一个套接字recv? 我们可以在同一个套接字上调用多个来自不同线程的并行发送吗? 我知道一个好的devise应该避免这一点,但我不清楚这些系统API将如何performance。 我也找不到一个好的文档。 任何方向的指针都会有所帮助。

套接字选项SO_REUSEADDR和SO_REUSEPORT,它们有什么不同? 他们在所有主要的操作系统中都是一样的吗?

套接字选项SO_REUSEADDR和SO_REUSEPORT的man pages和程序员文档对于不同的操作系统是不同的,并且通常非常混乱。 有些操作系统甚至没有SO_REUSEPORT选项。 WEB充斥着关于这个主题的矛盾信息,通常你可以find一些特定操作系统的一个socket实现的信息,这些信息甚至可能在文中都没有明确提到。 那么SO_REUSEADDR与SO_REUSEPORT什么不同呢? 没有SO_REUSEPORT系统更受限制吗? 如果我在不同的操作系统上使用其中一种,预期的行为究竟是什么?