UDP kullanarak ping işlemi nasıl yapılır?

Bu yazıda UDP(User Datagram Protocol) kullanarak basit bir ping işlemi nasıl yapılır kodlarını paylaşacağım.

Socket programlamada bilindiği üzere iki taraf gerekmektedir. Bir taraf sunucu ve bir taraf client olmalıdır. Aşağıda Python programlama dilinde yazılmış basit bir UDP tabanlı ping işlemi gerçekleştiren programı bulabilirsiniz.

Client.py dosyasının içeriği:

import socket
import sys
import time

try:
    socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  
    socket.settimeout(5)
except socket.error:
    print 'Failed to create socket'
    sys.exit()

host = '127.0.0.1' 
port = 25400

while (1):
    msg = "Default message => "
    try:
        raw_input(msg)
        send_time_ms = time.time()
        socket.sendto(msg, (host, port))  
        d = socket.recvfrom(1024)
        reply = d[0] 
        addr = d[1]  
        recv_time_ms = time.time()
        rtt_in_ms = round(recv_time_ms - send_time_ms, 3)
        print reply + "Recieve time in ms: (client) " + str(rtt_in_ms)

    except socket.gettimeout():
        print "timeout"
        continue

Server.py dosyasının içeriği:

import socket
import sys
import time

PORT = 25400
host_ip = '127.0.0.1'
try:
    sckt = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    print "Socket created"
except socket.error, msg:
    print 'error' + msg[1] 
    sys.exit()


try:
    sckt.bind((host_ip, PORT)) 
    sckt.settimeout(5)
    print ("socket successfully connected to " + host_ip)
except socket.error,msg:
    print 'bind failed Error no:' + str(msg[0]) + ' Message of Error: ' + msg[1]
    sys.exit()

print 'socket bind completed'


while True:

    try:
            send_time_ms = time.time()
            d = sckt.recvfrom(1024) 
            data = d[0]
            addr = d[1]
            reply = 'Ok....' + data
            recv_time_ms = time.time()
            rtt_in_ms = round(recv_time_ms - send_time_ms, 3)
            print reply + "Recieve time in ms: (client) " + str(rtt_in_ms)
            sckt.sendto(reply, addr)

    except sckt.gettimeout():
        print "timeout"

sckt.close()

Bu iki dosyayı Anaconda Navigator’de bulunan webspyder üzerinde açarsanız ve bu iki dosyayı çalıştırdıktan sonra terminalde iki farklı terminal ekranında önce sunucu tarafını sonra client tarafını çalıştırırsanız iki tarafın birbiriyle haberleştiğine şahit olabilirsiniz. Böylelikle iki taraf arasında basit bir UDP tabanlı bağlantı oluşturmuş olduk. Timeout’u da kullandığınız durumda tam anlamıyla UDP gibi çalışan bir ping programı elde edebilirsiniz. 🙂



GÜNCELLEME

Son zamanlara rağbet gören UDP ile ping işlemi yazısını güncellemek istiyorum. Yukarıda yazılan kod yalnızca Python2.x sürümlerinde çalışır durumdadır. Python3.x sürümünde bu ping işlemini yapmanın daha kısa bir yolu vardır:

import os
import sys

rep = os.system('ping -c 1' + address)
        if rep == 0:
            print('server is up!')
        else:
            print('server is down!')

Adres kısmında istediğiniz IP adresini yazarak bu IP adresine bir ping paketi gönderebilirsiniz.

Peki ya UDP ile ping işlemi Python3.x üzerinde nasıl yapılıyor derseniz onu da ekleyeyim 🙂

#server.py

import socket
import sys
import time

bufferSize = 1024
localIP = "127.0.0.1"
localPort = 30000
msgFromServer = "Hello Client"
bytesToSend = str.encode(msgFromServer)

UDPServerSocket = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)

UDPServerSocket.bind((localIP, localPort))

print("UDP server up and listening")

while(True):

    bytesAddressPair = UDPServerSocket.recvfrom(bufferSize)

    message = bytesAddressPair[0]

    address = bytesAddressPair[1]

    clientMsg = "Message from Client:{}".format(message)
    clientIP  = "Client IP Address:{}".format(address)
    
    print(clientMsg)
    print(clientIP)


    UDPServerSocket.sendto(bytesToSend, address)
#client.py

import socket
import sys
import time

address = '127.0.0.1';
serverAddressPort = (address,30000) #IP address and port number
msgFromClient = "Hello Server"
bytesToSend = str.encode(msgFromClient) #Encoding for data transfer
bufferSize = 1024
socket.setdefaulttimeout(5) #Optional
UDPClientSocket = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
send_time_ms = time.time()
UDPClientSocket.sendto(bytesToSend,serverAddressPort)
try:
    msgFromServer = UDPClientSocket.recvfrom(bufferSize)
    recv_time_ms = time.time()
    rtt_in_ms = round(recv_time_ms - send_time_ms, 5) #RTT
    msg = "Message from the target{}".format(msgFromServer[0])
    print(msg)
    print("Recieve time in ms: " + str(rtt_in_ms))
    print("\n")
except socket.error as e:
    print('\n 5 seconds timeout triggered: \n')
    


print("Process finished")