UDP 客户端从 Python 服务器发送和接收数据

时间:2021-07-24 16:02:58

标签: python sockets udp client recvfrom

我正在尝试编写一个可以发送和接收数据的 UDP 客户端。但是,我可以让它工作的唯一方法是在每次我想要发送或接收数据时重复创建然后关闭套接字。我猜这可能不是正确的做事方式,我应该只需要在进入循环之前创建一次套接字并在退出循环后关闭它。

我注意到如果我注释掉代码的接收部分,那么我只需要在进入 for 循环之前创建一次套接字,然后在退出 for 循环后关闭套接字,发送部分仍然可以正常工作。如果我再添加回接收代码,它要么挂在 s.recvfrom() 调用上,要么挂在 s.bind() 调用上,具体取决于它在代码中的位置。

我不确定我做错了什么,请参阅下面的附加代码,

import socket
import time
import struct

TX_UDP_IP = '172.24.15.34' #IP address of ETH SFP
TX_UDP_PORT = 4575

#TX Packet Header
TX_PACKETVERSION = 1
TX_P8ADDRESSOFFSET = 0
TX_SEQUENCENUM = 0

RX_UDP_IP = '172.24.2.7' #IP address of local machine
RX_UDP_PORT = 4575

BUFFER_SIZE = 1024

print("Entered Loop")
start = time.perf_counter()
for i_python in range(1,11):
    
    f_python = float(i_python) + 0.15

  
    send_data_str = struct.pack('>iiiid', TX_PACKETVERSION, TX_P8ADDRESSOFFSET, TX_SEQUENCENUM, i_python, f_python)
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.sendto(send_data_str, (TX_UDP_IP, TX_UDP_PORT))
    s.close()

    
    TX_SEQUENCENUM = TX_SEQUENCENUM + 1
    if TX_SEQUENCENUM > 1000:
        TX_SEQUENCENUM = 0
    
    print("Transmitted i_python = ",i_python," and f_python = ",f_python)
    
    time.sleep(1.0)
    
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.bind((RX_UDP_IP, RX_UDP_PORT))
    recv_data_str = s.recvfrom(BUFFER_SIZE)
    s.close()
    
    recv_data_str_unpacked = struct.unpack(">iiiid",recv_data_str[0])
    RX_PACKETVERSION = recv_data_str_unpacked[0]
    RX_P8ADDRESSOFFSET = recv_data_str_unpacked[1]
    RX_SEQUENCENUM = recv_data_str_unpacked[2]
    j_RTDS = recv_data_str_unpacked[3]
    t_RTDS = recv_data_str_unpacked[4]
    
    print("Recieved j_RTDS = ",j_RTDS," and t_RTDS = ",t_RTDS)
    
    
print ("Exited Loop")
finish = time.perf_counter() - start
print ('The execution time is %fs.' %finish)

编辑 1 2021-07-26:

好的,我收到了一些评论,要求我发布不起作用的代码版本以及相关的错误。所以这里是不工作的代码版本和相关的错误。

import socket
import time
import struct

TX_UDP_IP = '172.24.15.34' #IP address of ETH SFP
TX_UDP_PORT = 4575

#TX Packet Header
TX_PACKETVERSION = 1
TX_P8ADDRESSOFFSET = 0
TX_SEQUENCENUM = 0

RX_UDP_IP = '172.24.2.7' #IP address of local machine
RX_UDP_PORT = 4575

BUFFER_SIZE = 1024

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)


print("Entered Loop")
start = time.perf_counter()
for i_python in range(1,11):
    
    f_python = float(i_python) + 0.15

  
    send_data_str = struct.pack('>iiiid', TX_PACKETVERSION, TX_P8ADDRESSOFFSET, TX_SEQUENCENUM, i_python, f_python)
    s.sendto(send_data_str, (TX_UDP_IP, TX_UDP_PORT))

    
    TX_SEQUENCENUM = TX_SEQUENCENUM + 1
    if TX_SEQUENCENUM > 1000:
        TX_SEQUENCENUM = 0
    
    print("Transmitted i_python = ",i_python," and f_python = ",f_python)
    
    time.sleep(1.0)
    
    s.bind((RX_UDP_IP, RX_UDP_PORT))
    recv_data_str = s.recvfrom(BUFFER_SIZE)
    
    recv_data_str_unpacked = struct.unpack(">iiiid",recv_data_str[0])
    RX_PACKETVERSION = recv_data_str_unpacked[0]
    RX_P8ADDRESSOFFSET = recv_data_str_unpacked[1]
    RX_SEQUENCENUM = recv_data_str_unpacked[2]
    j_RTDS = recv_data_str_unpacked[3]
    t_RTDS = recv_data_str_unpacked[4]
    
    print("Recieved j_RTDS = ",j_RTDS," and t_RTDS = ",t_RTDS)
    
    
print ("Exited Loop")
s.close()
finish = time.perf_counter() - start
print ('The execution time is %fs.' %finish)

这是发生的错误,

Exception has occurred: OSError
[WinError 10022] An invalid argument was supplied
  File "C:\UDP_SKT_Python_R06.py", line 51, in <module>
    s.bind((RX_UDP_IP, RX_UDP_PORT))

0 个答案:

没有答案