gpt4 book ai didi

本地机器上的 python udp socket.timeout

转载 作者:行者123 更新时间:2023-12-01 05:49:22 25 4
gpt4 key购买 nike

因此,我正在使用 UDP 进行分配,制作一个基本的“ping”应用程序,除了 socket.settimeout() 的实现之外,一切正常。我似乎不明白为什么,但这与绑定(bind)的套接字有关。这可能只是 Python 中的一个怪癖,但我想在记录它之前确认一下。我不是在寻找功能代码答案(那是作弊),而是在寻找为什么我所拥有的代码被破坏了。 (例如:Python 不喜欢同一台机器上的客户端/服务器等一些未记录的原因)

Python 套接字超时详细信息:http://docs.python.org/2/library/socket.html#socket.socket.settimeout

在下面的代码中,与运行在同一台机器上的服务器的通信是成功的,但前提是客户端没有绑定(bind)到套接字。但如果它没有绑定(bind)到套接字,超时系统就会失败(这是通过关闭服务器来测试的,其中所有十个超时都会立即打印出来)。

注意:代码并不理想,但这是网络理论类(class)而不是编程类(class)。它最终必须起作用。我现在就可以交出A,但我想了解为什么超时功能不起作用。

编辑:为了澄清一个问题,在客户端中使用Bind是在看到服务器代码有它之后才意识到UDP不需要它,但它恰好使超时功能工作正常,但破坏了正常操作。socket.settimeout() 声明可能只适用于 TCP 吗?

客户端代码(有超时):

import socket
import time
import select


data = "Re-verify our range to target... one ping only. \n"

addrDest = ("127.0.0.1",8675)
addrLocal = ("127.0.0.1",12345)

totalTime = 0
averageTime = 0
totalPings = 0
#timeout_seconds = 1.0

UDPSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
UDPSock.bind(addrLocal)
# adding bind here even though it's UDP makes timeout work,
# but breaks normal functionality
UDPSock.settimeout(1)


while (totalPings < 10):
totalPings = (totalPings + 1)
start = time.clock()
str_list = []
str_list.append(str(totalPings))
str_list.append(" ")
str_list.append(str(start))
str_list.append(" ")
str_list.append(data)
dataOut = ''.join(str_list)
UDPSock.sendto(dataOut,addrDest)
try:
dataIn,addrIn = UDPSock.recvfrom(1024)
print dataIn.strip(),"\n",addrIn
elapsed = ((time.clock() - start) * 1000)
print elapsed, " ms round trip"
except socket.error:
print "Connection timed out for Packet #", totalPings

服务器代码:

import socket

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

# (to all IP addresses on this system)
listen_addr = ("",8675)
UDPSock.bind(listen_addr)

# Report on all data packets received and
# where they came from in each case (as this is
# UDP, each may be from a different source and it's
# up to the server to sort this out!)
while True:
data,addr = UDPSock.recvfrom(1024)
print data.strip(),addr
UDPSock.sendto(data,addr)

最佳答案

为什么需要绑定(bind)客户端本地地址?客户端是否会在任何时候也充当服务器?如果没有,则根本不需要绑定(bind)客户端。仅当您需要客户端充当服务器时,您才需要特定端口,如果您不调用绑定(bind),它将创建一个随机端口,范围从(0 - 1023 保留)1024 - 65535 (如果我没记错的话)并且这将是UDP数据包中的源端口,源地址是客户端运行的地址。

根据伯克利套接字

bind() assigns a socket to an address. When a socket is created using socket(), 
it is only given a protocol family, but not assigned an address. This association with an address must be performed with the bind() system call before the socket can accept connections to other hosts

如果这是一个网络类项目,并且您正在尝试实现客户端-服务器架构,那么您永远不应该在客户端代码中调用bind,因为客户端永远不应该充当服务器,并且客户端应该连接到监听服务器而不是连接到客户端的服务器。

更新:

可能需要从 TCP 客户端-服务器设计中调用 Bind,但不能从 UDP 客户端-服务器模型中调用,因为 UDP 是发送后忘记设计,并且没有低级别数据包发送成功确认。 UDP 数据包本身包含源地址和端口。

关于本地机器上的 python udp socket.timeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14971406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com