/*
作者:张亚霏
2008-12-03早
*/
/*
UDP主机不可达、端口不可达测试
*/
/*
向一个已知主机的打开端口发一个UDP包,无任何异常
*/
/*
向一个已知主机的未打开端口发一个UDP包
主机返回一个ICMP端口不可达报文
结果就是之后的recvfrom返回-1
GetLastError() WSAECONNRESET
or
errno ECONNRESET
*/
/*
向一个未知主机的某端口发一个UDP包
可能无任何回应
也可能是中间路由器返回一个ICMP主机不可达报文,但是这种情况很少见
结果就是之后的recvfrom返回-1
GetLastError() WSAEHOSTUNREACH
or
errno EHOSTUNREACH
*/
#if defined WIN32 || defined _WIN32
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
int init_net()
{
WSADATA wsa_data;
return 0 != WSAStartup(MAKEWORD(2,2), &wsa_data);
}
void uninit_net()
{
WSACleanup();
}
int close_socket(SOCKET s)
{
return closesocket(s);
}
int get_last_error()
{
return WSAGetLastError();
}
#else
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>
#include <errno.h>
int init_net()
{
return 1;
}
void uninit_net()
{
}
typedef int SOCKET;
int close_socket(SOCKET s)
{
return close(s);
}
int get_last_error()
{
return errno;
}
#endif
#define BUFFER_SIZE 1024
#define DEST_ADDRESS "127.0.0.1"//"192.168.1.2"
#define DEST_PORT 27015//1037
int main()
{
SOCKET send_socket;
struct sockaddr_in recv_addr;
char send_buf[BUFFER_SIZE];
char recv_buf[BUFFER_SIZE];
int ret;
fd_set read_set;
struct timeval time_out;
init_net();
send_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
recv_addr.sin_family = AF_INET;
recv_addr.sin_port = htons(DEST_PORT);
recv_addr.sin_addr.s_addr = inet_addr(DEST_ADDRESS);
ret = sendto(send_socket,
send_buf,
BUFFER_SIZE,
0,
(struct sockaddr*) &recv_addr,
sizeof(recv_addr));
FD_ZERO(&read_set);
FD_SET(send_socket, &read_set);
time_out.tv_sec = 1;
time_out.tv_usec = 0;
ret = select(send_socket+1, &read_set, NULL, NULL, &time_out);
if(ret == 1 && FD_ISSET(send_socket, &read_set))
{
ret = recvfrom(send_socket, recv_buf, BUFFER_SIZE, 0, NULL, NULL);
if(ret == -1)
{
printf("get_last_error() %d\n", get_last_error());
perror(NULL);
}
}
close_socket(send_socket);
uninit_net();
return 0;
}
分享到:
相关推荐
可是由于大部分系统都限制了ICMP 差错报文的产生速度,所以针对特定主机的UDP 大量端口扫描速度缓慢,此外由于UDP 协议和ICMP 协议都是不可靠协议,所以未收到回应可能由于数据包未送达造成,所以扫描程序需要针对...
ICMP就是所谓的Internet控制报文协议(Internet Control Message Protocol),在网络中,一般用它来传递差错报文以及其他应注意的信息。ICMP一般被认为是和IP协议同一层的协议,IMCP报文通常被IP层或者更高层的协议...
例如,当一个IP数据包无法到达目的地时,路由器或者目标主机可能会发送一个ICMP差错报告报文。此外,ping使用的ICMP回显请求/应答报文是ICMP的一个重要应用,它允许一个主机验证其与另一个网络设备之间的通信是否...
- **类型**:8位,区分不同类型的ICMP消息,如差错报告或信息查询。 - **代码**:8位,进一步细化类型,定义具体的功能。 - **校验和**:16位,用于验证ICMP消息头和数据的完整性。 3. **TCP报头**: - **源和...
ICMP就是所谓的Internet控制报文协议(Internet Control Message Protocol),在网络中,一般用它来传递差错报文以及其他应注意的信息。ICMP一般被认为是和IP协议同一层的协议,IMCP报文通常被IP层或者更高层的协议...
- 对于接收到的ICMP差错报告报文,不会再次发送差错报告。 #### 六、ICMP与其他协议的关系 - **与IP协议**: - ICMP位于IP协议之上,作为IP的一部分,用于增强IP数据报的可靠性和可管理性。 - **与高层协议**: -...
但是,ICMP差错报文本身不会产生其他的ICMP差错报文,以避免循环反馈。例如,源地址不能是零地址、环回地址、广播地址或多播地址的IP数据报,或不是IP分片的第一片,都不会触发ICMP差错报文。 2. **Socket编程接口*...
实验中,学生会发现当目的端口错误时,不会接收到数据,且会收到ICMP(Internet Control Message Protocol)的目的不可达差错报文。 **DNS实验**: 实验5.2旨在让学生掌握DNS请求包的编辑,理解域名解析的过程。...
在ICMP差错报告报文中,需要分类哪些类型的ICMP差错报告报文是由路由器发送的,哪些类型的ICMP差错报告报文是由目的主机发送的。 8. IP协议和UDP协议 在IP协议和UDP协议中,需要了解它们是一种不可靠的无连接数据...
ICMP报文的传输方式类似于TCP/UDP报文,首先,原始数据被封装进ICMP报文,再由IP协议封装成IP数据报进行传输。接收方收到数据后,会逐层解封装,获取到ICMP报文中的错误信息。 ICMP报文格式通常包含一个报头,报头...
ICMP 协议种类有两种,分为 ICMP 差错报告报文与 ICMP 询问报文。 2.1.1 ICMP 差错报告报文 ICMP 差错报告报文有 4 类:目的处不可达,超时报文,参数问题报文,源抑制报文。ICMP 差错报告协议报文字段分析:前四...
查询报文则是用于网络诊断和控制,比如著名的“Ping”命令就利用了ICMP的回送请求和应答报文来测试网络连通性。此外,还有时间戳请求和应答(用于测量IP分组的传输时间或同步时钟)、地址掩码请求和应答(获取网络...
ICMP报文可以被IP层或更高协议(TCP或UDP)使用。一些ICMP报文把差错报文返回给用户进程。 ICMP协议的工作流程如下: 1. ICMP报文的发送:当网络出现错误或需要诊断时,ICMP报文将被发送。 2. ICMP报文的传输:...
ICMP主要负责在IP层进行差错控制和网络诊断,它并不像TCP或UDP那样用于数据传输,而是提供一种机制,使得网络设备能够报告和响应网络故障或异常情况。在Ping命令中,ICMP被用来发送请求和接收回应,以此检测网络的...
对于ICMP报文的处理,有几条规则以避免无限循环的错误报告,例如,对ICMP差错报告报文不再发送ICMP差错报告,对多播地址的数据报、特定特殊地址(如127.0.0.0或0.0.0.0)的数据报以及后续的数据报片都不发送ICMP差错...
- **接收和解析ICMP差错报文**:捕获并解读返回的ICMP超时消息以获取路由器信息。 7. **课程设计目标和内容**: - 目标是提高对计算机网络的理解,掌握网络协议,理解IP地址和路由命令。 - 内容包括设计一个能够...
ICMP是一种用于在互联网中传递差错和控制信息的协议,它对于网络的健康运行和故障排查至关重要。下面将详细解释ICMP的相关知识点。 首先,ICMP重定向是当路由器检测到主机发送的报文使用了非最优路由时,路由器会向...
1. 差错报告报文:当IP数据包无法到达目的地或者遇到其他问题时,路由器或目标主机将返回这种类型的报文,如“目标不可达”、“超时”、“参数问题”等。 2. 查询报文:用于网络诊断和查询网络状态,比如“回显请求/...