问题标签 [berkeley-sockets]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sockets - 哪些协议值与 socket() 中的域和类型的哪些组合兼容?
我在玩伯克利插座,然后我这样做了:
输出是:Error in creating socket: Protocol not supported
. 我选择了 58,因为我想尝试 ICMP IPv6 套接字作为示例,并使用/etc/protocols
我得到的内容:
ipv6-icmp 58 IPv6-ICMP # ICMP for IPv6
. 然后我尝试0
代替58
上面的代码,程序运行良好。所以我的问题是:
为什么在 socket() 调用中需要这个第三个参数,如果我们
已经在第二个参数中指定(TCP)作为协议,即这个(第三个参数)SOCK_STREAM
存在的原因是什么?protocol
如果
protocol
(第三个参数)是必要的,那么(第一个参数)和(第二个参数)
的所有可能组合可以采用什么值?domain
type
如果有人可以用示例解释这一点,那将非常有帮助,否则也可以。谢谢
c++ - 如何确定网络堆栈何时准备好再次打开到同一主机/端口的套接字?
我有以下 C 程序,其主函数runTCPConnectivityCheck
打开一个 TCP 套接字,向它发送一串字节并关闭它:
如果我尝试重复测试同一个端口,第一次调用就runTCPConnectivityCheck
可以正常工作,但所有后续调用都会在调用connect
. 如果我将调用添加到sleep
in,那么它也可以工作。据推测,1 秒的延迟给了网络堆栈足够的时间来清理套接字,以便我可以再次连接到同一个端口。
首先:我是否正确关闭了套接字?其次:如果我正确关闭它,确定网络堆栈何时准备好再次连接到同一主机和端口的标准方法是什么(而不是sleep
我目前使用的la脚)?
更新
更多详细信息:失败并显示错误connect
代码 61 或返回“连接被拒绝”。ECONNREFUSED
strerror
本例中的服务器是在与测试程序相同的机器上循环运行的netstat
/命令:nc
程序现在是 C,真的。
sockets - IPv6 范围 ID 与 IPv4
最近我正在使用用于 IPv6 的 Berkeley 套接字 API,并注意到 IPv6 地址 ( sockaddr_in6
) 有一个名为 的字段sin6_scope_id
,它不是 IPv4 地址的一部分。
经过一番搜索,我了解到这scope_id
是为了识别网络接口,因为多个网络接口可以具有相同的链路本地 IPv6 地址。这是有道理的,但是我不明白的是 IPv4 如何处理这个问题,如果那里没有等效的范围 ID?
内核中是否有一种机制可以防止多个 IPv4 接口被分配相同的链路本地地址?
如果是这样,那么为什么有必要为 IPv6 发明范围 ID 而不是使用与 IPv4 相同的解决方案?
此外,scope_id 是否仅用于区分具有相同链路本地地址的接口,还是还有其他用例?
c++ - 通过 setsockopt() 禁用套接字超时
假设我在 C++ 中有以下代码,它将设置套接字的超时时间:
如何使用相同的命令禁用超时?
c - 如何找到本地/临时端口号?
我有一个使用 Berkley 套接字和 Winsock(取决于平台)的 UDP 客户端程序。
基本上它使用getaddrinfo()
, then socket()
, then sendto()
。sendto()
获取由 . 返回的地址信息getaddrinfo()
。我的代码如下所示:
我的问题是,什么时候设置本地/临时端口号?是否设置了对 的调用sendto()
?如果我将更多数据发送到不同的服务器,是否会sendto()
重用相同的临时端口号?如何获取临时端口号(以独立于协议的方式)?我知道知道这可能没有用,而且 NAT 无论如何都可以改变它,但我只是想了解它是如何更好地工作的。
我也知道我可以bind()
用来设置本地端口,但我的问题是当操作系统为我选择本地端口时会发生什么。
c - 为什么 Berkeley 套接字需要字节交换?
我知道在网络上,大多数整数都是大端格式。
但是为什么应用程序的负担是在像sockaddr_in
内核这样的结构中进行字节交换而不是在所有底层工作实际发生的地方?如果用户空间 API 更与平台无关并且不应该处理这个问题,那将更有意义。
为什么伯克利套接字 API 是这样设计的?
sockets - “socket”函数的“domain”参数与“数据链路”层有什么关系?
我正在阅读UNIX® Network Programming Volume 1, Third Edition: The Sockets Networking API,在第1.7 页 OSI 模型中,作者介绍了“OSI 模型”和等效的“Internet 协议套件”。
查看手册页socket(2)
,我了解到该domain
参数用于选择“网络”层,该type
参数定义了“传输”层。
如果这种理解是正确的,如果我AF_BLUETOOTH
在 Wifi 数据链路上使用会怎样?我想它不会连接到目标端点。那么,程序员必须提前知道数据链路,才能domain
正确设置参数?如果他/她使用其他 BSD 功能来发现可用的数据链路,他/她将如何知道domain
使用哪个值?有没有办法在程序运行时type
根据数据链路知道应该使用哪个?
c - 接收多播数据包的用户缓冲区大小?
以下代码来自 Git。它加入一个多播组并接收数据包。
在这里,我们循环并在一个名为的缓冲区中接收数据msgbuf
:
如何选择缓冲区的大小msgBuf
?它只是必须是最大数据包大小吗?还是在处理第一个数据包时需要存储多个数据包?
完整代码:
c++ - 中止(核心转储)从 C++ 中的向量中删除元素
我正在尝试使用“MUD 游戏编程”学习 C++,并且正在研究示例,但是当我尝试从向量中删除连接时,我收到错误消息:“已中止(核心转储)。” 这通常在从向量中擦除最后一个时发生。我尝试了一些解决方案,例如在删除之前检查迭代器 != connlist.end() ,如果列表中只剩下一个元素,则尝试使用 connlist.clear() ,但这些似乎没有帮助.
我正在使用 g++ 编译和使用 Cygwin。
错误发生在 connlist.erase() 中,您可以看到当用户键入“quit”时会调用它。
作为参考,这本书是:Penton, Ron。MUD 游戏编程。美国马萨诸塞州波士顿:课程技术/Cengage Learning,2003 年。
sockets - UDP 数据报在套接字中存储多长时间?
我在 openSUSE Linux (v15.1) 中,使用 berkeley 套接字。
我有一个“发送者”应用程序,每秒发送一个数据报。另一个一直在阅读的“接收器”应用程序。它运作良好。
但是如果我都关闭了,从发送者发送一些数据报,关闭它......然后激活接收器,没有什么可以读取的。所以数据报不见了。
我需要这个,因为我正在以给定的速度读取数据报,并且我需要确保其中至少有一个保持在那里。
我发现在套接字上设置了一个“接收缓冲区”,您可以使用“ getsockopt ”读取和更改输入和输出缓冲区的信息,并使用“setsockopt”进行更改。
但是当我读取套接字时,即使我知道发送了一些东西,也什么都没有。那么包裹在那里存放了多长时间?. 我找不到任何方法来检查或更改“getsockopt”选项。