python - UDP 客户端从服务器 Python 发送和接收数据
问题描述
我正在尝试编写一个可以发送和接收数据的 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))
解决方案
推荐阅读
- tensorflow - 使用 Tensorflow 对象检测 API 进行迁移学习时,如何更改隐藏层的数量?
- r - 有效地从矩阵列中减去
- react-native - React Native Material Dropdown - 如何处理 onPress 事件下拉列表?
- php - 密码没有得到散列,并尝试连接返回错误 500 Symfony
- css - 我的网页从哪里加载其 scss 文件?
- mysql - JPA:如何表示 JoinTable 和 JoinTable 的复合键?
- git - 将我电脑上安装的 Git 链接到 Github
- vba - Excel宏VBA搜索某些字符串
- php - 正则表达式在一个模式中查找重复的短语 2 个顺序单词
- django - Django - 在管理过滤器中使用模型管理器方法