Socket编程:UDP Ping

Socket编程:UDP Ping

使用python采用UDP协议编写一个ping程序,发送一个简单的ping报文给服务器,并确定从客户发送ping报文服务器到接受到pong报文为止的时延,称为往返时延(RTT) 。
因为UDP是一个不可靠的协议,客户发送的分组可能会丢失,为此,客户不能无限期地等待服务器的响应,等待时间至多为1s,否则,打印一条错误信息。

UDP_Pinger_Sever.py

import random
from socket import *
#AF_INET指定使用IPv4协议,如果要用更先进的IPv6,就指定为AF_INET6
#SOCK_DGRAM指定了这个Socket的类型是UDP
serverSocket = socket(AF_INET, SOCK_DGRAM)
#用0.0.0.0绑定到所有的网络地址,还可以用127.0.0.1绑定到本机地址
serverSocket.bind((‘127.0.0.1‘,12000))

while True:
	#产生一个0到10之间的随机数
	rand = random.randint(0, 10)
	#从套接口上读取数据,参数为缓冲区大小
	message, address = serverSocket.recvfrom(1024)
	#通过打印我们可以看到UDP客户端socket的端口是不确定,系统随机分配的
	print("收到来自 %s 的报文: (%s)" % (address,message))
	# 把接收到的信息全部转为大写
	print("随机数是: %d" % rand)
	message = message.upper()
	#如果随机数小于4,服务端无应答,客户端就会超时
	if rand < 4:
		continue
	serverSocket.sendto(message, address)

UDP_Pinger_Client.py

import time
from socket import *
serverName = ‘127.0.0.1‘ # 主机
serverPort = 12000
# 创建Socket时,AF_INET指定使用IPv4协议,如果要用更先进的IPv6,就指定为AF_INET6
# SOCK_DGRAM指定了这个Socket的类型是UDP
# SOCK_STREAM指定使用面向流的TCP协议
clientSocket = socket(AF_INET, SOCK_DGRAM)
clientSocket.settimeout(1) # 设置超时时间为1s
for i in range(0, 10):
	oldTime = time.time()
	sendTime = time.strftime(‘%Y-%m-%d %H:%M:%S‘, time.localtime(oldTime))
	# encode()把str转成bytes,传输格式要求
	message = (‘package %d,client_local_time:%s‘ % (i + 1, sendTime)).encode()
	try:
		# 发送数据
		clientSocket.sendto(message, (serverName, serverPort))
		# 1024指定要接收的最大数据量为1kb = 1024 bytes
		# recvfrom是一个系统调用,由用户态转向系统态,从套接口上接收数据,并捕获数据发送源的地址。
		# 如果数据报大于缓冲区,那么缓冲区中只有数据报的前面部分,其他的数据都丢失了,并且recvfrom()函数返回WSAEMSGSIZE错误
		# 如果没有数据待读,那么除非是非阻塞模式,不然的话套接口将一直等待数据的到来,果没有在Timeout = 1s内接收到数据,此时将返回SOCKET_ERROR错误,错误代码是WSAEWOULDBLOCK。用select()或WSAAsynSelect()可以获知何时数据到达
		# UDP的 recvfrom() 和 TCP 的recv()不一样,具体可以看 TCP Ping项目
		modifiedMessage, serverAddress = clientSocket.recvfrom(1024)
		# 计算往返时间
		rtt = time.time() - oldTime
		# decode 把bytes转成str
		modifiedMessage = modifiedMessage.decode("utf-8")
		print(‘报文 %d 收到来自 %s 的应答: %s,往返时延(RTT) = %fs‘ % (i+1, serverName,modifiedMessage, rtt))
	except Exception as e:
		print(‘报文 %d: 的请求超时‘ % (i+1)) # 处理异常

运行

原文地址:https://www.cnblogs.com/Weber-security/p/12661681.html

时间: 2024-11-09 10:16:26

Socket编程:UDP Ping的相关文章

python socket编程 UDP

python socket编程 UDP by 伍雪颖 server.py import socket BUF_SIZE = 1024 server_addr = ('127.0.0.1',8888) server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) server.bind(server_addr) while True: print "waiting for data" data,client_addr = server.

Java基础&mdash;socket编程&mdash;UDP发送及接收

简介:在同一主机上测试,同一IP地址,不同的端口,使用UDP发收数据 使用socket编程,通过UDP协议发送数据 需求:使用UDP协议向某IP的某端口发送一条数据 UdpSend.java package com.Train; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.ne

socket编程---UDP

头文件 #include <sys/types.h> #include <sys/socket.h> 函数原型 int sendto (int s, const void *buf, int len, unsigned int flags, const struct sockaddr *to, int tolen); int recvfrom(int s, void *buf, int len, unsigned int flags, struct sockaddr *from,

linux下socket编程-UDP

下面是UDP的服务器的代码: /* server.c */ #include <stdio.h> #include <string.h> #include <netinet/in.h> #include <arpa/inet.h> #include <ctype.h> #include "wrap.h" #define MAXLINE 80 #define SERV_PORT 8000 int main(void) { str

网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服务器进程B1同时为客户进程A1.A2和B2提供服务. Socket概述 ①   所谓Socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过“套接字”向网络发出请求或者应答网络请求. ②   Socket是连接运行在网络上的两个程序间的双向通信的端点. ③  

Swift和C混合Socket编程实现简单的ping命令

这个是用Mac下的Network Utility工具实现ping命令,用Wireshark抓取的ICMP数据包: 发送ICMP数据包内容 接受ICMP数据包内容 一.icmp结构 要真正了解ping命令实现原理,就要了解ping命令所使用到的TCP/IP协议.ICMP(Internet Control Message,网际控制报文协议)是为网关和目标主机而提供的一种差错控制机制,使它们在遇到差错时能把错误报告给报文源发方.ICMP协议是IP层的 一个协议,但是由于差错报告在发送给报文源发方时可能

Java TCP/UDP socket 编程流程总结

最近正好学习了一点用java socket编程的东西.感觉整体的流程虽然不是很繁琐,但是也值得好好总结一下. Socket Socket可以说是一种针对网络的抽象,应用通过它可以来针对网络读写数据.就像通过一个文件的file handler就可以都写数据到存储设备上一样.根据TCP协议和UDP协议的不同,在网络编程方面就有面向两个协议的不同socket,一个是面向字节流的一个是面向报文的. 对socket的本身组成倒是比较好理解.既然是应用通过socket通信,肯定就有一个服务器端和一个客户端.

基于TCP/UDP的socket编程

基于TCP(面向连接)的socket编程服务器端顺序: 1. 创建套接字(socket) 2. 将套接字绑定到一个本地地址和端口上(bind) 3. 将套接字设为监听模式,准备接收客户请求(listen) 4. 等待客户请求的到来:当请求带来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept) 5. 用返回的套接字和客户端进行通信(send/recv) 6. 返回,等待另一个客户请求 7. 关闭套接字(closesocket)客户端程序: 1. 创建套接字(socket) 2.

基于UDP的socket编程

一.相关函数说明 UDP是无连接的,即发送数据之前不需要建立连接. 除了基于TCP中的socket编程所需的函数之外,基于UDP的socket编程中还需要用到两个函数. 1.sendto函数:用于客户端中指定一目的地发送数据. (1)函数原型 (2)参数说明 sockfd:套接字 buf:待发送数据的缓冲区 len:缓冲区长度 flags:调用方式标志位,一般为0:若改变flags,则sendto发送数据的形式会变成阻塞 dest_addr:指向目的套接字的地址 addrlen:指向目的套接字的