`
zhangyafei_kimi
  • 浏览: 265537 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

UDP的ICMP差错的测试程序

阅读更多
/*
作者:张亚霏
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:Internet控制报文协议

    1. **ICMP差错报文本身**:ICMP差错报文不会对其自身再次产生差错报文。 2. **广播地址或多播地址的目的地址**:为了防止广播风暴,这类地址的数据报不会产生ICMP差错报文。 3. **非第一片的IP分片**:仅第一片分片...

    C实现UDP端口扫描

    可是由于大部分系统都限制了ICMP 差错报文的产生速度,所以针对特定主机的UDP 大量端口扫描速度缓慢,此外由于UDP 协议和ICMP 协议都是不可靠协议,所以未收到回应可能由于数据包未送达造成,所以扫描程序需要针对...

    icmp.rar_TCP或者UDP_tracert

    ICMP就是所谓的Internet控制报文协议(Internet Control Message Protocol),在网络中,一般用它来传递差错报文以及其他应注意的信息。ICMP一般被认为是和IP协议同一层的协议,IMCP报文通常被IP层或者更高层的协议...

    ICMP-Ping源码

    例如,当一个IP数据包无法到达目的地时,路由器或者目标主机可能会发送一个ICMP差错报告报文。此外,ping使用的ICMP回显请求/应答报文是ICMP的一个重要应用,它允许一个主机验证其与另一个网络设备之间的通信是否...

    2022年全国计算机技术与软件技术(水平)考试-网络工程师IP-TCP-UDP-ICMP报头详解.docx

    - **类型**:8位,区分不同类型的ICMP消息,如差错报告或信息查询。 - **代码**:8位,进一步细化类型,定义具体的功能。 - **校验和**:16位,用于验证ICMP消息头和数据的完整性。 3. **TCP报头**: - **源和...

    ICMP.rar_icmp ip linux_命令介绍

    ICMP就是所谓的Internet控制报文协议(Internet Control Message Protocol),在网络中,一般用它来传递差错报文以及其他应注意的信息。ICMP一般被认为是和IP协议同一层的协议,IMCP报文通常被IP层或者更高层的协议...

    ICMP协议原理及应用课件.pptx

    - 对于接收到的ICMP差错报告报文,不会再次发送差错报告。 #### 六、ICMP与其他协议的关系 - **与IP协议**: - ICMP位于IP协议之上,作为IP的一部分,用于增强IP数据报的可靠性和可管理性。 - **与高层协议**: -...

    协议专栏特别福利 答疑解惑第三期1

    但是,ICMP差错报文本身不会产生其他的ICMP差错报文,以避免循环反馈。例如,源地址不能是零地址、环回地址、广播地址或多播地址的IP数据报,或不是IP分片的第一片,都不会触发ICMP差错报文。 2. **Socket编程接口*...

    实验5--UDP与DNS

    实验中,学生会发现当目的端口错误时,不会接收到数据,且会收到ICMP(Internet Control Message Protocol)的目的不可达差错报文。 **DNS实验**: 实验5.2旨在让学生掌握DNS请求包的编辑,理解域名解析的过程。...

    TCPIP协议大作业--修改版..pdf

    在ICMP差错报告报文中,需要分类哪些类型的ICMP差错报告报文是由路由器发送的,哪些类型的ICMP差错报告报文是由目的主机发送的。 8. IP协议和UDP协议 在IP协议和UDP协议中,需要了解它们是一种不可靠的无连接数据...

    所谓 ICMP,不过将军与士卒而已(csdn)————程序.pdf

    ICMP报文的传输方式类似于TCP/UDP报文,首先,原始数据被封装进ICMP报文,再由IP协议封装成IP数据报进行传输。接收方收到数据后,会逐层解封装,获取到ICMP报文中的错误信息。 ICMP报文格式通常包含一个报头,报头...

    Eason的不正经的计算机网络讲义

    ICMP 协议种类有两种,分为 ICMP 差错报告报文与 ICMP 询问报文。 2.1.1 ICMP 差错报告报文 ICMP 差错报告报文有 4 类:目的处不可达,超时报文,参数问题报文,源抑制报文。ICMP 差错报告协议报文字段分析:前四...

    计算机网络课件:2_6_6 ICMP协议.pptx

    查询报文则是用于网络诊断和控制,比如著名的“Ping”命令就利用了ICMP的回送请求和应答报文来测试网络连通性。此外,还有时间戳请求和应答(用于测量IP分组的传输时间或同步时钟)、地址掩码请求和应答(获取网络...

    ICMP协议报文格式和协议解析

    ICMP报文可以被IP层或更高协议(TCP或UDP)使用。一些ICMP报文把差错报文返回给用户进程。 ICMP协议的工作流程如下: 1. ICMP报文的发送:当网络出现错误或需要诊断时,ICMP报文将被发送。 2. ICMP报文的传输:...

    用C语言实现Ping程序功能

    ICMP主要负责在IP层进行差错控制和网络诊断,它并不像TCP或UDP那样用于数据传输,而是提供一种机制,使得网络设备能够报告和响应网络故障或异常情况。在Ping命令中,ICMP被用来发送请求和接收回应,以此检测网络的...

    数据通信与计算机网络PPT学习教案.pptx

    对于ICMP报文的处理,有几条规则以避免无限循环的错误报告,例如,对ICMP差错报告报文不再发送ICMP差错报告,对多播地址的数据报、特定特殊地址(如127.0.0.0或0.0.0.0)的数据报以及后续的数据报片都不发送ICMP差错...

    traceroute程序设计及实现.doc

    - **接收和解析ICMP差错报文**:捕获并解读返回的ICMP超时消息以获取路由器信息。 7. **课程设计目标和内容**: - 目标是提高对计算机网络的理解,掌握网络协议,理解IP地址和路由命令。 - 内容包括设计一个能够...

    华为数通+ICMP+思维导图

    ICMP是一种用于在互联网中传递差错和控制信息的协议,它对于网络的健康运行和故障排查至关重要。下面将详细解释ICMP的相关知识点。 首先,ICMP重定向是当路由器检测到主机发送的报文使用了非最优路由时,路由器会向...

    202001Internet协议分析实验报告(第2天).docx

    实验重点是ICMP差错报文的分析,包括目标不可达和超时两种类型。在目标不可达报文的实验中,通过ping不存在的IP地址,观察捕获到的ICMP响应,识别其类型。而在超时实验中,通过构造具有特定生存时间(TTL)的ICMP...

Global site tag (gtag.js) - Google Analytics