组播地址
SO_REUSEADDR对于多播地址的含义发生了变化,因为它允许将多个套接字绑定到源多播地址和端口的完全相同的组合上。换句话说,对于多播地址,SO_REUSEADDR的行为与对于单播地址,SO_REUSEPORT的行为完全相同。实际上,代码对组播地址的SO_REUSEADDR和SO_REUSEPORT是相同的,这意味着您可以说SO_REUSEADDR意味着所有组播地址都是SO_REUSEPORT。
和
它可以通过这个简单的测试代码重现:
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
int main() {
for(int p = 0; p < 4; ++p) {
printf("Flags set: ");
if(p&1) printf("SO_REUSEADDR ");
if(p&2) printf("SO_REUSEPORT");
printf("\n");
int handles[2];
bool success = true;
for(int i = 0; i < sizeof(handles)/sizeof(int); ++i) {
handles[i] = socket(AF_INET, SOCK_DGRAM, 0);
int flag = 1;
if((p&1) && setsockopt(handles[i], SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag)) == -1) {
printf("Setsockopt %d, SO_REUSEADDR failed with errno\n", i, errno);
success = false;
break;
}
if((p&2) && setsockopt(handles[i], SOL_SOCKET, SO_REUSEPORT, &flag, sizeof(flag)) == -1) {
printf("Setsockopt %d, SO_REUSEPORT failed with errno\n", i, errno);
success = false;
break;
}
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = 2000; // does not matter as long as it is currently free
addr.sin_addr.s_addr = 0; // wildcard address
if(bind(handles[i], (struct sockaddr*)&addr, sizeof(addr)) == -1) {
printf("Bind %d failed with errno %d\n", i, errno);
success = false;
break;
}
}
if(success)
printf("Alright\n");
for(int i = 0; i < sizeof(handles)/sizeof(int); ++i)
close(handles[i]);
printf("\n");
}
return 0;
}
哪些产出:
Flags set:
Bind 1 failed with errno 48
Flags set: SO_REUSEADDR
Bind 1 failed with errno 48
Flags set: SO_REUSEPORT
Alright
Flags set: SO_REUSEADDR SO_REUSEPORT
Alright
问题内容: 在和套接字选项程序员单证,并针对不同的操作系统,不同的,往往混淆高度。有些操作系统甚至没有该选项。WEB充满了与此主题相关的信息,通常您会发现仅对于特定操作系统的一个套接字实现才是正确的信息,甚至在本文中也没有明确提及。 那么到底有什么不同呢? 系统没有更多限制吗? 如果我在不同的操作系统上使用任一操作系统,预期的行为到底是什么? 问题答案: 欢迎来到美好的便携性世界……或者说缺少它。
如果我在不同的操作系统上使用任何一个,那么预期的行为是什么?
本文向大家介绍详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别,包括了详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别的使用技巧和注意事项,需要的朋友参考一下 Socket的基本背景 在讨论这两个选项的区别时,我们需要知道的是BSD实现是所有socket实现的起源。基本上其他所有的系统某种程度上都参考了BSD socket实现(或者至少是其接口),然后开始了
简单验证器 向属性添加“验证”例程的快速方法是使用 validates() 装饰者。属性验证器可以引发异常,停止改变属性值的过程,或者将给定值更改为其他值。与所有属性扩展一样,验证程序只由普通的userland代码调用;当ORM填充对象时不会发出验证程序:: from sqlalchemy.orm import validates class EmailAddress(Base): __
问题内容: 以下是一个简单的声明 当我运行它时输出为。我不知道原因。 在执行期间(字节)-1返回-1,因此等价于。当我打印(char)-1时,它 仅 在某些系统中打印,而不在所有系统中打印。 如果我忽略上述第二点并打印(int)’?’ 然后打印63 所以我的问题是,如果我一起进行多播,那我得到了,但是如果我分部进行了广播,那 (字节)-1 (字符)-1 (int)’?’ 然后我得到63,为什么呢?
当我试图将多个对象累积到一个JSONObject中时,我有一个非常奇怪的交互。 我正在使用json-20180813.jar导入的库 请参阅下面的代码 预期输出如下: 主密钥{value2 value1} 非主键{value2 value3} 相反,我最终得到了这个 我的问题是,为什么. put()对万能钥匙有影响? 注意:如果我使用第二个新的JSONObject()并累积该对象,这个问题就解决了