Linux环境下服务器利用组播来获取客户端IP
单播是两个主机之间端对端通信(比如TCP、UDP通信),而广播用于一个主机对整个局域网中所有主机的通信。单播和广播是两个极端,要么对一个主机通信,要么对局域网内所有主机通信。然而在实际情况下,比如要获取局域网内获取执行特殊任务主机IP,单播显然不适用,因为单播必须首先要知道通信两端的IP,而使用广播显得浪费资源。在这种需要对局域网下一组特定的主机进行通信的情况下,就用到了组播。 本文针对以上情况,从组播概念、组播编程和本机IP地址获取三个方面展开阐述。
什么是组播?
组播就是将网络中同一业务类型的主机进行逻辑上的分组,进行数据收发的时候,数据仅仅仅仅在同一分组内进行,没有加入分组的主机不能收发对应的数据。
说的更通俗一点,主机好比你qq中的联系人,组播组就好比你新建的讨论组,只有加入讨论组的成员才能接受发送消息。
组播地址
说起组播地址就不得不说一下IP地址的分类。IP地址共分为五类,分别是A类、B类、C类、D类和E类。五类不同的IP地址。
5类IP地址:
类别 | 固定最高位 | 网络位 | 第一字节范围 |
---|---|---|---|
A | 0 | 8 | 0~127 |
B | 10 | 16 | 128~191 |
C | 110 | 24 | 192~223 |
D | 1110 | 组播地址 | 224~239 |
E | 11110 | 预留 | 240~255 |
D类的IP地址就是组播IP地址。其中,组播IP地址又分为局部组播地址、预留组播地址和管理权限组播地址。
- 局部组播地址:在224.0.0.0~224.0.0.255之间,这个区间的地址视为路由协议和其他用途保留的地址,路由器并不妆发范围的IP包。
- 预留组播地址:在224.0.1.0~238.255.255.255之间,可用于路由协议。
- 管理权限组播地址:在239.0.0.0~239.255.255.255之间,类似于私有地址,不能用于网络。
获取本机IP地址
主要用到了ioctl 函数(设备控制接口)来从网卡中获取IP信息和主机信息。顾名思义,ioctl函数就是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。它的调用个数如下:
int ioctl(int fd, ind cmd, …);
其中fd是用户程序打开设备时使用open函数返回的文件标示符,cmd是用户程序对设备的控制命令,至于后面的省略号,那是一些补充参数,一般最多一个,这个参数的有无和cmd的意义相关。
ioctl函数是文件结构中的一个属性分量,就是说如果你的驱动程序提供了对ioctl的支持,用户就可以在用户程序中使用ioctl函数来控制设备的I/O通道。
获取本机IP地址和主机名的完整代码如下:
#define ETH_NAME "eth"
void getIPHost(char** iphost)
{
int sock;
struct sockaddr_in sin;
struct ifreq ifr;
sock = socket(AF_INET, SOCK_DGRAM, 0);
for(int i = 0; i < 10; i++)
{
char* ENAME = (char*)malloc(5*sizeof(char));
bzero(ENAME, 5);
sprintf(ENAME, "%s%d", ETH_NAME, i);
strncpy(ifr.ifr_name,