您可能知道在没有管理权限的情况下,无法使用Windows套接字创建RAW套接字.问题是,我需要发送ICMP消息,因此我需要RAW套接字.问题:我的程序需要在没有管理权限的情况下运行.
这引出了我的问题,ping工具如何发送没有管理权限的ICMP消息?
是否可以在IP协议下使用ICMP套接字?也许是这样的:
socket(PF_INET, <type>, IPPROTO_ICMP)?
我应该在<type>字段中放入什么?我看到了一些使用SOCK_RAW的例子,但这不会阻止操作系统处理IP协议的工作吗?
另一件事.操作系统如何知道应该将ICMP数据报发送到哪个进程,因为该协议没有涉及端口?
我目前正在尝试编写一个程序,该程序将读取包含IP地址列表的文本文件,并分别ping每个IP地址.如果主机响应ping,则主机的IP地址将被复制到用户指定的借调文件中.不经意的是,这是我第一次使用C的套接字库,我找不到关于如何使用C进行ping的好教程.据我所知,我找到了几个教程.我需要在IP数据报中包含一个ICMP头,它是一个包含ICMP类型,代码和校验和的结构.但我不知道该怎么做,我应该自己声明结构还是在头文件中声明?我假设它在一个标题中但是教程相互矛盾的确切地说明了它的位置.我厌倦了包括icmp.h和netinet/icmp.h,但我的编译器抱怨它们不存在所以我创建了自己的结构.
struct echo_request
{
char type; // Type
char code; // Code
short checksum; // Checksum
short id; // Identification
short seq; // Sequence
int time; // Time
char data[16]; // Data
};
Run Code Online (Sandbox Code Playgroud)
我认为我可能能够逃脱它,但我甚至无法编译我的程序,因为我的编译器说in_cksum()(校验和生成器)是未定义的.
总结我的问题,我应该包括哪些头文件,如何创建ping数据包,我使用正确的校验和生成器函数,ping是否应该指向端口80,我使用的套接字应该是RAW还是DGRAM?
这是我到目前为止,请注意我故意遗漏了错误检查.
int socket_descriptor = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
struct sockaddr_in address; //Initialize address struct
memset(&address, 0, sizeof(address)); //Clear address struct
//Declare address
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr(ipaddress);
address.sin_port = htons(80);
//Bind socket to address
bind(socket_descriptor, (struct sockaddr *)&address, …Run Code Online (Sandbox Code Playgroud) 我必须写一个ping函数才能在Linux上运行.语言是C++,所以C也可以.
在Internet上搜索并查看ping命令的源代码,结果证明我应该创建一个原始套接字:
icmp_sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
Run Code Online (Sandbox Code Playgroud)
如果我在没有超级用户的情况下运行我的应用程序,则该socket函数返回,-1即套接字未成功创建.如果我以超级用户身份运行它,一切正常.
现在,该ping命令会创建一个原始套接字,我可以在没有超级用户权限的情况下运行它.
我的问题是:如何在没有超级用户执行的情况下授予我的应用程序创建原始套接字所需的所有权限?