个人网站可以做社区吗,知名wordpress博客,徐州建设工程交易网招标公告最新,wordpress 添加头像struct packet_mreq
struct packet_mreq 是一个数据结构#xff0c;用于 Linux 中的原始数据包套接字#xff0c;当我们想改变套接字的行为以接收特定类型的数据包时#xff0c;它与 setsockopt() 函数配合使用。
下面是 struct packet_mreq 的定义#xff1a;
struct p…struct packet_mreq
struct packet_mreq 是一个数据结构用于 Linux 中的原始数据包套接字当我们想改变套接字的行为以接收特定类型的数据包时它与 setsockopt() 函数配合使用。
下面是 struct packet_mreq 的定义
struct packet_mreq {int mr_ifindex; // Interface index of the network deviceunsigned short mr_type; // Type of membership (e.g., PACKET_MR_PROMISC, PACKET_MR_MULTICAST)unsigned short mr_alen; // Address lengthunsigned char mr_address[8]; // Physical layer address
};各字段的详细解释 mr_ifindex: 这是网络接口的索引号。我们可以使用 if_nametoindex() 函数将接口名称如 “eth0”转换为其索引。注if_nametoindex(iface_name) 函数用于将网络接口名称如 “eth0”转换为与该接口关联的接口索引。接口索引是内核用于唯一标识网络接口的整数。当 if_nametoindex 函数不能找到指定名称的网络接口时它会返回0。因此检查返回值是否为0可以告诉我们是否成功获取了接口索引。 mr_type: 这是要修改的成员资格类型。例如 PACKET_MR_PROMISC: 设置接口为混杂模式。PACKET_MR_MULTICAST: 加入多播组。PACKET_MR_UNICAST: 添加一个单播地址。PACKET_MR_ALLMULTI: 接收所有多播数据包。PACKET_MR_BROADCAST: 接收所有广播数据包。 mr_alen: 用于指定在 mr_address 字段中的物理地址长度。例如对于以太网地址这将是6。 mr_address: 物理层地址。这通常是以太网MAC地址但长度取决于实际的物理层。例如当 mr_type 为 PACKET_MR_MULTICAST 时我们将在此字段中指定要加入的多播地址。
例如如果想将网络接口 “eth0” 设置为混杂模式可以这样做
struct packet_mreq mr;
memset(mr, 0, sizeof(mr));
mr.mr_ifindex if_nametoindex(eth0);
mr.mr_type PACKET_MR_PROMISC;
setsockopt(sock, SOL_PACKET, PACKET_ADD_MEMBERSHIP, mr, sizeof(mr));而如果想加入一个特定的多播地址则设置 mr_type 为 PACKET_MR_MULTICAST并提供相应的多播MAC地址。
示例
本例展示了如何为特定的网络接口例如 “eth0”设置混杂模式并加入一个特定的多播地址。
#include stdio.h
#include stdlib.h
#include string.h
#include sys/socket.h
#include linux/if_packet.h
#include net/if.h
#include arpa/inet.hint main() {int sock;struct packet_mreq mr;const char* iface_name eth0;// 创建一个原始套接字sock socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));if (sock 0) {perror(Error in socket creation);exit(EXIT_FAILURE);}// 设置网络接口为混杂模式memset(mr, 0, sizeof(mr));mr.mr_ifindex if_nametoindex(iface_name);if (mr.mr_ifindex 0) {perror(Error getting interface index);exit(EXIT_FAILURE);}mr.mr_type PACKET_MR_PROMISC;if (setsockopt(sock, SOL_PACKET, PACKET_ADD_MEMBERSHIP, mr, sizeof(mr)) 0) {perror(Error setting socket to promiscuous mode);exit(EXIT_FAILURE);}// 假设我们要加入的多播MAC地址是 01:00:5E:10:20:30unsigned char multicast_address[6] {0x01, 0x00, 0x5E, 0x10, 0x20, 0x30};mr.mr_type PACKET_MR_MULTICAST;mr.mr_alen 6;memcpy(mr.mr_address, multicast_address, 6);if (setsockopt(sock, SOL_PACKET, PACKET_ADD_MEMBERSHIP, mr, sizeof(mr)) 0) {perror(Error adding multicast membership);exit(EXIT_FAILURE);}printf(Interface %s set to promiscuous mode and joined multicast address 01:00:5E:10:20:30.\n, iface_name);// ... 这里可以添加其他代码例如数据包捕获和处理close(sock);return 0;
}上述代码首先为 “eth0” 网络接口设置混杂模式然后加入了特定的多播MAC地址 “01:00:5E:10:20:30”。需要有适当的权限来执行这个代码通常需要root权限。 加入特定的多播MAC地址允许网络接口接收发送到该特定多播地址的数据包。这与多播的基本工作方式有关。这里是一个简要的概述 多播多播是在IP网络上向多个接收者发送信息的方法但不是向所有接收者发送信息这称为广播。多播发送的数据包被发送到一个特定的多播IP地址并由加入该多播组的接收者接收。 多播MAC地址由于数据链路层例如以太网并不了解IP地址因此IP多播地址被映射到一个特定的MAC地址范围。这意味着当一个多播数据包在以太网上发送时它实际上是发送到一个特定的多播MAC地址。 加入多播组如果应用程序对某个多播组感兴趣即它想要接收发送到该组的数据包则需要告诉我们的网络接口加入该组。这样当接口看到发送到相关多播MAC地址的数据包时它就知道需要接收它们而不是忽略它们。 用途 多播视频和音频流例如一个服务器可以将实时视频流发送到多播地址而所有希望查看该视频流的客户端只需加入相关的多播组即可。路由协议一些路由协议使用多播来交换路由信息。服务发现一些协议如mDNS使用多播来发现网络上的服务。其他还有许多其他使用多播的场景从股票交易到计算机游戏的实时多玩家数据。
总之通过加入特定的多播MAC地址我们的网络接口或应用程序可以选择性地接收发送到这些地址的数据包这对于需要接收特定多播数据的应用程序来说是很有用的。
setsockopt()
setsockopt() 是一个系统调用用于设置与某个套接字关联的选项。此函数允许应用程序在各种协议级别上设置或更改多种套接字行为。
以下是 setsockopt() 的基本形式
int setsockopt(int socket, int level, int option_name, const void *option_value, socklen_t option_len);参数解释
socket它是要设置选项的套接字的文件描述符。level这决定了哪个协议的选项应该被设置。例如要设置TCP选项可以使用 IPPROTO_TCP 作为级别。常见的级别包括 SOL_SOCKET、IPPROTO_IP 和 IPPROTO_TCP。option_name这是我们想要设置的具体选项的名称。例如SO_REUSEADDR 和 SO_KEEPALIVE 都是 SOL_SOCKET 级别的选项。option_value这是一个指向要设置选项的新值的指针。option_len这是 option_value 指向的数据的大小。
常见用途 端口重用当套接字关闭后端口可能会保持在 TIME_WAIT 状态一段时间。如果想立即重启服务器并重新绑定到相同的端口可以使用 SO_REUSEADDR 选项。 int optval 1;
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, optval, sizeof(optval));设置发送/接收缓冲区的大小例如我们可能希望增大套接字的发送或接收缓冲区。 int bufsize 1024 * 1024; // 1MB
setsockopt(sock, SOL_SOCKET, SO_RCVBUF, bufsize, sizeof(bufsize));TCP 选项例如TCP_NODELAY 选项可以用于禁用 Nagle’s 算法使得小的数据包可以被更快地发送。 int flag 1;
setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, flag, sizeof(int));返回值
成功时返回 0。失败时返回 -1 并设置 errno。
错误
EBADF描述符不是一个有效的套接字。ENOPROTOOPT指定的协议级别不识别该选项。EFAULToption_value 指向的内存不是一个有效的部分。
要获取套接字选项的当前值可以使用 getsockopt() 函数。
注意具体支持哪些选项和级别可能因操作系统而异建议查阅特定操作系统的手册页或相关文档以获取详细和完整的信息。 setsockopt() 的 level 和 option_name 参数可以取多种值具体取决于操作系统。以下是一些常见的选项及其解释
1. level: SOL_SOCKET
这是通用的套接字选项级别。 SO_REUSEADDR 说明允许套接字和其他套接字绑定到相同的地址和端口。这对于在短时间内多次关闭、打开同一地址、端口的服务器应用程序很有用。 SO_KEEPALIVE 说明如果套接字没有接收到数据在一段时间后将开始发送keepalive消息。这有助于确保连接仍然活动并确定远程主机是否还在线。 SO_RCVBUF 和 SO_SNDBUF 说明设置或获取接收或发送缓冲区的大小。 SO_RCVTIMEO 和 SO_SNDTIMEO 说明设置或获取接收或发送超时。 SO_ERROR 说明获取套接字上的待处理错误。 SO_TYPE 说明获取套接字的类型。
2. level: IPPROTO_IP
这是IP层的选项。 IP_TTL 说明设置或获取Time To Live字段的值。 IP_MULTICAST_IF 说明指定用于发送多播数据报的出口接口。 IP_ADD_MEMBERSHIP 和 IP_DROP_MEMBERSHIP 说明加入或离开多播组。 IP_HDRINCL 说明指示应用程序将提供完整的IP头部。
3. level: IPPROTO_TCP
这是TCP层的选项。 TCP_NODELAY 说明控制Nagle算法是否用于套接字。这对于希望快速发送小的数据包的应用程序很有用。 TCP_MAXSEG 说明获取或设置TCP最大段大小。
这只是一个简要的概述实际上有更多的选项和级别可供选择。这些选项的行为、可用性以及如何正确使用它们可能会因操作系统和其版本而异。因此在使用特定的选项时最好查阅所使用的操作系统的手册页或其他相关文档。
getsockopt()
getsockopt() 函数用于获取套接字选项。该函数允许应用程序查看或修改套接字的当前选项值。与setsockopt()类似getsockopt()也可以在多种层次上获取选项例如 SOL_SOCKET通用套接字层、IPPROTO_IPIP层和IPPROTO_TCPTCP层等。
函数原型
int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);参数
sockfd标识套接字的文件描述符。level选项定义的级别例如SOL_SOCKET、IPPROTO_IP。optname需要访问的选项名称例如SO_REUSEADDR、TCP_NODELAY。optval指向值的指针该值将被获取。optlen作为输入时表示optval的最大长度作为输出时表示optval的实际长度。
返回值 成功时返回0失败时返回-1。
示例
以下是使用getsockopt()获取套接字发送缓冲区大小的示例
#include stdio.h
#include stdlib.h
#include sys/socket.hint main(void) {int sockfd socket(AF_INET, SOCK_STREAM, 0);if (sockfd 0) {perror(socket);exit(EXIT_FAILURE);}int sendbuff;socklen_t optlen sizeof(sendbuff);// 获取SO_SNDBUF选项的值if(getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, sendbuff, optlen) -1) {perror(getsockopt);close(sockfd);exit(EXIT_FAILURE);}printf(Send buffer size %d\n, sendbuff);close(sockfd);return 0;
}与setsockopt()相同getsockopt()也有许多可用的level和optname选项并且它们的含义与setsockopt()函数中的相同。不同的操作系统和版本可能会支持不同的选项所以建议查阅特定操作系统的手册页或其他文档来了解完整的详细信息。 文章转载自: http://www.morning.bppml.cn.gov.cn.bppml.cn http://www.morning.cbpmq.cn.gov.cn.cbpmq.cn http://www.morning.kaoshou.net.gov.cn.kaoshou.net http://www.morning.tnhqr.cn.gov.cn.tnhqr.cn http://www.morning.kjcll.cn.gov.cn.kjcll.cn http://www.morning.zxwqt.cn.gov.cn.zxwqt.cn http://www.morning.pfnrj.cn.gov.cn.pfnrj.cn http://www.morning.ptlwt.cn.gov.cn.ptlwt.cn http://www.morning.rtryr.cn.gov.cn.rtryr.cn http://www.morning.hgfxg.cn.gov.cn.hgfxg.cn http://www.morning.mlgsc.com.gov.cn.mlgsc.com http://www.morning.fjkkx.cn.gov.cn.fjkkx.cn http://www.morning.ftdlg.cn.gov.cn.ftdlg.cn http://www.morning.shinezoneserver.com.gov.cn.shinezoneserver.com http://www.morning.ltcnd.cn.gov.cn.ltcnd.cn http://www.morning.nfzzf.cn.gov.cn.nfzzf.cn http://www.morning.nynpf.cn.gov.cn.nynpf.cn http://www.morning.pttrs.cn.gov.cn.pttrs.cn http://www.morning.brmbm.cn.gov.cn.brmbm.cn http://www.morning.txysr.cn.gov.cn.txysr.cn http://www.morning.ffptd.cn.gov.cn.ffptd.cn http://www.morning.krzrg.cn.gov.cn.krzrg.cn http://www.morning.mlckd.cn.gov.cn.mlckd.cn http://www.morning.rjcqb.cn.gov.cn.rjcqb.cn http://www.morning.xfjwm.cn.gov.cn.xfjwm.cn http://www.morning.qrmyd.cn.gov.cn.qrmyd.cn http://www.morning.bykqg.cn.gov.cn.bykqg.cn http://www.morning.cfjyr.cn.gov.cn.cfjyr.cn http://www.morning.tnfyj.cn.gov.cn.tnfyj.cn http://www.morning.rdxnt.cn.gov.cn.rdxnt.cn http://www.morning.wklmj.cn.gov.cn.wklmj.cn http://www.morning.c7617.cn.gov.cn.c7617.cn http://www.morning.dshxj.cn.gov.cn.dshxj.cn http://www.morning.wtlyr.cn.gov.cn.wtlyr.cn http://www.morning.bkkgt.cn.gov.cn.bkkgt.cn http://www.morning.tjcgl.cn.gov.cn.tjcgl.cn http://www.morning.rwmft.cn.gov.cn.rwmft.cn http://www.morning.rqbr.cn.gov.cn.rqbr.cn http://www.morning.bcngs.cn.gov.cn.bcngs.cn http://www.morning.mtbsd.cn.gov.cn.mtbsd.cn http://www.morning.kfhm.cn.gov.cn.kfhm.cn http://www.morning.tnjkg.cn.gov.cn.tnjkg.cn http://www.morning.cndxl.cn.gov.cn.cndxl.cn http://www.morning.qsctt.cn.gov.cn.qsctt.cn http://www.morning.nzhzt.cn.gov.cn.nzhzt.cn http://www.morning.qdxkn.cn.gov.cn.qdxkn.cn http://www.morning.hytfz.cn.gov.cn.hytfz.cn http://www.morning.xctdn.cn.gov.cn.xctdn.cn http://www.morning.gbqgr.cn.gov.cn.gbqgr.cn http://www.morning.bzkgn.cn.gov.cn.bzkgn.cn http://www.morning.mfltz.cn.gov.cn.mfltz.cn http://www.morning.srrrz.cn.gov.cn.srrrz.cn http://www.morning.lpzqd.cn.gov.cn.lpzqd.cn http://www.morning.zqcgt.cn.gov.cn.zqcgt.cn http://www.morning.gfrjs.cn.gov.cn.gfrjs.cn http://www.morning.wfjyn.cn.gov.cn.wfjyn.cn http://www.morning.prjns.cn.gov.cn.prjns.cn http://www.morning.bpzw.cn.gov.cn.bpzw.cn http://www.morning.rfwrn.cn.gov.cn.rfwrn.cn http://www.morning.hsklc.cn.gov.cn.hsklc.cn http://www.morning.cpmwg.cn.gov.cn.cpmwg.cn http://www.morning.wfwqr.cn.gov.cn.wfwqr.cn http://www.morning.mcwrg.cn.gov.cn.mcwrg.cn http://www.morning.gczqt.cn.gov.cn.gczqt.cn http://www.morning.yrjym.cn.gov.cn.yrjym.cn http://www.morning.kxbry.cn.gov.cn.kxbry.cn http://www.morning.njhyk.cn.gov.cn.njhyk.cn http://www.morning.rzpkt.cn.gov.cn.rzpkt.cn http://www.morning.jgncd.cn.gov.cn.jgncd.cn http://www.morning.smpmn.cn.gov.cn.smpmn.cn http://www.morning.qysnd.cn.gov.cn.qysnd.cn http://www.morning.twwzk.cn.gov.cn.twwzk.cn http://www.morning.llcsd.cn.gov.cn.llcsd.cn http://www.morning.mmzhuti.com.gov.cn.mmzhuti.com http://www.morning.jwsrp.cn.gov.cn.jwsrp.cn http://www.morning.gcszn.cn.gov.cn.gcszn.cn http://www.morning.bmpjp.cn.gov.cn.bmpjp.cn http://www.morning.mlckd.cn.gov.cn.mlckd.cn http://www.morning.bmnm.cn.gov.cn.bmnm.cn http://www.morning.ktlfb.cn.gov.cn.ktlfb.cn