python--簡單的UDP通信

UDP簡介

UDP是一個簡單的面向數據報的運輸層協議。UDP數據報包含UDP首部和數據兩部分。UDP的首部結構如下圖:

在這裏插入圖片描述
端口號標識發送進程和接收進程。UDP長度字段指的是UDP首部和UDP數據的字節長度。UDP檢驗和覆蓋UDP首部和UDP數據,UDP的檢驗和是可選的。UDP檢驗和是一個端到端的檢驗和。

在網絡中數據的傳輸,需要知道計算機的地址,計算機的地址就是ip地址。進程會產生UDP數據報,並封裝成IP數據報進行傳輸。
在這裏插入圖片描述
UDP協議是不可靠的,只負責將數據發送出去,並不保證到達目的地。

簡單實例

window的ip爲192.168.1.27,linux的ip爲192.168.190.144,window向linux發送UDP請求。

import  socket
def send_msg(udp_socket):
    """發送消息"""
    dest_ip = input("請輸入對方的ip:")
    dest_port = int(input("請輸入對方的port:"))
    send_data = input("請輸入要發送的消息:")
    udp_socket.sendto(send_data.encode("utf-8"), (dest_ip, dest_port))
def recv_msg(udp_socket):
    """接收數據"""
    recv_data = udp_socket.recvfrom(1024)
    print("%s:%s" % (str(recv_data[1]), recv_data[0].decode("utf-8")))

def main():
    # 創建套接字
    udp_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    # 綁定端口
    udp_socket.bind(('192.168.1.27',7788))

    while True:
       send_msg(udp_socket)
       recv_msg(udp_socket)
if __name__=="__main__":
        main()

window向linux中指定端口傳入數據:
在這裏插入圖片描述
從在linux中用抓包工具抓到的數據包可以看出有UDP相關的包傳入linux中。

[root@mdw tmp]# tcpdump -i eth2 -nn udp 
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth2, link-type EN10MB (Ethernet), capture size 65535 bytes
19:14:57.294420 IP 192.168.190.1.63986 > 239.255.255.250.1900: UDP, length 174
19:14:58.295971 IP 192.168.190.1.63986 > 239.255.255.250.1900: UDP, length 174
19:14:59.296365 IP 192.168.190.1.63986 > 239.255.255.250.1900: UDP, length 174
19:15:00.297296 IP 192.168.190.1.63986 > 239.255.255.250.1900: UDP, length 174

前面的例子是一個單向的傳輸。接下來看一下雙向的信息傳輸:
在這裏插入圖片描述
發送方:

import  socket
def send_msg(udp_socket):
    """發送消息"""
    dest_ip = input("請輸入對方的ip:")
    dest_port = int(input("請輸入對方的port:"))
    send_data = input("請輸入要發送的消息:")
    udp_socket.sendto(send_data.encode("utf-8"), (dest_ip, dest_port))
def recv_msg(udp_socket):
    """接收數據"""
    recv_data = udp_socket.recvfrom(1024)
    print("%s:%s" % (str(recv_data[1]), recv_data[0].decode("utf-8")))

def main():
    # 創建套接字
    udp_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    # 綁定端口
    udp_socket.bind(('127.0.0.1',7788))

    while True:
       send_msg(udp_socket)
       recv_msg(udp_socket)
if __name__=="__main__":
        main()

接收方:

import  socket
def send_msg(udp_socket):
    dest_ip = "127.0.0.1"
    dest_port = 7788
    send_data = input("Please input you want to speak:")
    udp_socket.sendto(send_data.encode("utf-8"), (dest_ip, dest_port))
def recv_msg(udp_socket):
    recv_data = udp_socket.recvfrom(1024)
    print("%s:%s" % (str(recv_data[1]), recv_data[0].decode("utf-8")))

def main():
    udp_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    udp_socket.bind(('127.0.0.1',7799))

    while True:
       recv_msg(udp_socket)
       send_msg(udp_socket)

if __name__=="__main__":
        main()

發送方:
在這裏插入圖片描述
接收方:
!](https://img-blog.csdnimg.cn/20200328212522153.png)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章