sockets - IPPROTO_IP 与 IPPROTO_TCP/IPPROTO_UDP

标签 sockets ip

我在查找有关 socket 的第三个参数的这些设置之间的区别的文档时遇到了一些麻烦。是。我知道 TCP 和 UDP 及其差异,而且 IP 是堆栈上的一层(下?)...无论我将其设置为 IPPROTO_IP,我的 UDP 代码似乎都一样工作。或 IPPROTO_UDP .

最佳答案

socket() 的文档在 Linux 上分为不同的联机帮助页,包括 ip(7)指定您必须使用 0IPPROTO_UDP对于 UDP 和 0IPPROTO_TCP用于 TCP。当您使用 0 ,恰好是 IPPROTO_IP 的值, UDP 用于 SOCK_DGRAM TCP 用于 SOCK_STREAM .

在我看来,创建 UDP 或 TCP IPv4 套接字对象的干净方法如下:

int sock_udp = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
int sock_tcp = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

原因是通常显式比隐式更好。在这种特定情况下,使用 0或更糟IPPROTO_IP因为第三个论点对你没有任何好处。

还可以想象使用可以同时处理流和数据报的协议(protocol),如 sctp。通过始终指定 socktype 和协议(protocol),您可以避免任何歧义。

关于sockets - IPPROTO_IP 与 IPPROTO_TCP/IPPROTO_UDP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5385312/

相关文章:

c - 在服务器模式下如何发现连接的 TCP 套接字的本地 IP 地址

python - 无法通过 Python 中的套接字进行客户端-服务器通信

c - 如何使用 C 套接字正确发送数据和管理进程

java - 如何连接到具有不同 IP 地址的网站?

.htaccess - htaccess 通过 IP 地址拒绝除美国以外的所有 IP 地址?

sockets - 如何从Golang中的socket io获取ip地址

c# - 如何在C#中以编程方式控制VLC?

java - 使用 WAN IP 而不是本地主机的 RESTful Web 应用程序

c# - 在 C# 中使用 IP 协议(protocol)上的原始套接字读取传入数据包

Linux 庆典 : How to group a ip list into common subnets?