是否可以在IP协议下使用ICMP套接字?也许是这样的:
socket(PF_INET, <type>, IPPROTO_ICMP)?
我应该在<type>字段中放入什么?我看到了一些使用SOCK_RAW的例子,但这不会阻止操作系统处理IP协议的工作吗?
另一件事.操作系统如何知道应该将ICMP数据报发送到哪个进程,因为该协议没有涉及端口?
我设置了3个CentOS服务器,将server2配置为192.168.1.0/24和30.0.0.0/24之间的路由器,但ping无法通过.
我尝试ping 192.168.1.62从server1,根据tcpdumpserver3,收到ICMP请求,但它不会生成ICMP响应.
23:36:06.436243 IP 30.0.0.2 > 192.168.1.62: ICMP echo request, id 23570, seq 2838, length 64
23:36:07.436212 IP 30.0.0.2 > 192.168.1.62: ICMP echo request, id 23570, seq 2839, length 64
Run Code Online (Sandbox Code Playgroud)
server1的:
服务器2:
server(服务器):
server1上的路由信息:
server3上的路由信息:
我知道ICMP请求包含IP地址.客户端MAC地址是否包含在ICMP请求中?ping请求中还包含哪些其他信息(如果有)?
在说什么之前让我告诉你我在网络相关科目上没有受过良好教育.
我是一名软件开发人员,我已经在端口8000上编写并在HTTPS上公开了一个服务.现在我想知道,如果有任何类型的软件可以帮助我跟踪是否有任何类型的端口阻塞从一个站点到我的服务地点与阻止主机的信息.
我已经尝试过像Wintrace这样的Tracerout软件,但所有这些都使用ICMP协议,并且没有选项提供端口号.
此外,我喜欢在防火墙中为Windows Server 2003 Windows防火墙中的传入ICMP协议添加例外但我无法在例外情况下看到任何广告协议选项,而只有选项来广告程序或广告端口的udp或tcp.
请帮忙问候
应该可以使用Ruby套接字库发送和接收ICMP数据包,但我没有看到任何关于此的良好文档.
我不想使用net-ping,icmp,ping和所有这些因跨平台问题而失败的其他库,需要devkit和自定义构建,在构建过程中失败,被忽略且尚未更新很长一段时间,和/或只是一般的马车.
有没有人有关于如何做到这一点的任何好文件?我想发送ICMP回应回复,而不是TCP或UDP数据包.
在Windows Azure角色中,我无法ping通
D:\Users\foglight>ping www.google.com
Pinging www.l.google.com [209.85.143.104] with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Ping statistics for 209.85.143.104:
Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
Run Code Online (Sandbox Code Playgroud)
我谷歌它,并发现一些建议运行下面的命令,但即使运行它,我仍然无法ping出来
netsh advfirewall firewall add rule name="ICMPv6" dir=in action=allow enable=yes protocol=icmpv6
Run Code Online (Sandbox Code Playgroud)
请有人告诉我原因以及如何解决.
我目前正在尝试编写一个程序,该程序将读取包含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) 当我尝试sudo ping -f (URL)在mac终端上使用该命令时,我收到消息:
请求icmp_seq超时作为回复.
我怎样才能解决这个问题?
这一切都始于我尝试连接到 GCP 上仅用于 SFTP 的虚拟机设置时。每次我尝试在这台计算机上检查 SSH 或设置 SFTP 时,它都会变得无法访问(同时在我朋友的笔记本电脑上可以访问并且连接良好)。
Ping <ip address>
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Run Code Online (Sandbox Code Playgroud)
我可以 ping 其他虚拟机,也可以通过 SSH 连接到它们。
我认为问题可能出在我的路由器上。所以我使用手机 HOTSPOT 连接到互联网并再次尝试。但还是没用。此外,令我惊讶的是,当我 ping www.google.com 时,我也遇到了同样的超时(奇怪,因为我可以通过 chrome 浏览器使用互联网)。
其他详情:
其他人似乎也遇到了类似的问题(但我在这些链接中找不到任何令人满意的答案):
我很难理解为什么我的程序中在网络上发送 ICMP 回显请求的部分会出现此错误。最重要的是,我可以通过让套接字处理 IP 标头来使其工作,但是当我设置 IP_HDRINCL 选项并为其提供有效的 IP 标头时,它会返回 EINVAL 错误:
initialize
using interface en0 with ip 192.168.1.126 and mac a4:83:e7:43:40:81.
Input start ip/scan range: 192.168.1.1
[45, 0, 0, 1c, 20, 1, 40, 0, 40, 1, 97, 10, c0, a8, 1, 7e, c0, a8, 1, 1, 8, 0, 22, 2a, 97, 3e, 3e, 97]
[69, 0, 0, 28, 32, 1, 64, 0, 64, 1, 151, 16, 192, 168, 1, 126, 192, 168, 1, 1, 8, 0, 34, 42, 151, 62, …Run Code Online (Sandbox Code Playgroud)