Socket程式設計 UDP Ping

2022-08-17 08:45:10 字數 2572 閱讀 1459

使用python採用udp協議編寫乙個ping程式,傳送乙個簡單的ping報文給伺服器,並確定從客戶傳送ping報文伺服器到接受到pong報文為止的時延,稱為往返時延(rtt) 。

因為udp是乙個不可靠的協議,客戶傳送的分組可能會丟失,為此,客戶不能無限期地等待伺服器的響應,等待時間至多為1s,否則,列印一條錯誤資訊。

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)

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)) # 處理異常

socket程式設計

一直以為serversocket accept之後客戶端才能發資訊,實驗後得出如下結論 1 serversocket沒有accept時,client是可以傳送資訊到server端的。2 serversocket accept之後,正在處理訊息時,client也是可以傳送資訊到server端。如果se...

Socket程式設計

對tcp ip udp socket程式設計這些詞你不會很陌生吧?隨著網路技術的發展,這些詞充斥著我們的耳朵。那麼我想問 1.什麼是tcp ip udp?2.socket在 呢?3.socket是什麼呢?4.你會使用它們嗎?什麼是tcp ip udp?tcp ip transmission cont...

socket程式設計

建立socket 建立乙個 socket,它可用於在基於 tcp ip 的網路 如 internet 上通訊。socket s new socket addressfamily.internetwork,sockettype.stream,protocoltype.tcp 若要使用 udp 而不是 ...