网络编程笔记

常用函数

inet_pton和inet_addr函数的区别

两者都是用于处理网络编程中地址的函数。
inet_pton:internet presentation to Network
inet_addr:internet address
头文件:<arpa/inet.h>(address and routing parameter area/internet)
函数原型:
int inet_pton(int af, const char *src, void *dst);
支持IPv4或IPv6地址表示转换为网络字节序的二进制形式,
af参数指定地址族,可以是AF_INET(address family internet,IPv4)或AF_INET6(IPv6);src参数是一个以字符串形式表示的IP地址;dist参数是一个指向存放网络地址转换结果的地址的指针。
转换成功返回1,否则返回0。
inet_addr:
头文件:<arpa/inet.h>
函数原型:in_addr_t inet_addr(const char *cp);
仅支持IPv4,cp参数是一个以字符串形式表示的IPv4地址。
成功返回一个in_addr_t类型的值,失败则返回INADDR_NONE。
路由(拓展)
在计算机网络中,路由(Routing)是指确定网络中数据包从源节点到目标节点的路径的过程。它涉及到将数据包从一个网络节点(或路由器)转发到下一个节点的决策。
当一台计算机或设备发送数据包时,它会根据目标地址选择一个合适的路径,使数据能够从源节点到达目标节点。这个路径的选择是通过路由协议和路由表来确定的。

hotons和hotonl

用于处理字节序转换
hotonl:host to network long。用于将32位整数(长整型)从主机字节序转换为网络字节序(大端字节序)。
hotons:host to network short。用于将16为整数(短整型)从主机字节序转换为网络字节序。
如果地址是INADDR_ANY用hotonl转换而不用inet_addr或inet_pton。

setsockopt

setsockopt:
int opt = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
SOL_SOCKET套接字级别选项。(SOL:socket level)
SO_REUSEADDR允许地址重用。
这段代码允许了地址重用,可以使套接字能够在关闭后立即重新绑定相同的地址和端口,而不会因为之前的连接还未完全关闭而出现错误。这在服务器程序中经常使用,特别是在服务器需要频繁重启或绑定到相同地址和端口的情况下。
注意:setsockopt需要写在bind之前。

加入组播

struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr(“224.0.0.88”);
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
if (setsockopt(clientfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mreq, sizeof(mreq)) < 0) {
std::cerr << “Failed to join multicast group” << std::endl;
close(clientfd);
return;
}
setsockopt(clientfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mreq, sizeof(mreq))
IPPROTO_IP是IP层设置。
IP_ADD_MEMBERSHIP用于加入某个组播组。
注:设置端口复用可以实现同一设备上一对多的通信。