Python套接字不传递数据包
我正在使用套接字库用Python创建一个简单的消息传递服务器和客户端。首先,在让用户发送消息之前,我要进行一些验证和密钥交换。每隔一段时间,我就会遇到一个问题,服务器会发送一条消息,而客户端不会接收到消息,然后服务器会继续尝试接收消息,但客户端仍在阻止接收调用,因此它们处于死锁状态。我很困惑这是怎么发生的,因为我认为套接字API运行的是TCP,应该保证传输 这是服务器端的一部分:Python套接字不传递数据包,python,python-3.x,sockets,tcp,Python,Python 3.x,Sockets,Tcp,我正在使用套接字库用Python创建一个简单的消息传递服务器和客户端。首先,在让用户发送消息之前,我要进行一些验证和密钥交换。每隔一段时间,我就会遇到一个问题,服务器会发送一条消息,而客户端不会接收到消息,然后服务器会继续尝试接收消息,但客户端仍在阻止接收调用,因此它们处于死锁状态。我很困惑这是怎么发生的,因为我认为套接字API运行的是TCP,应该保证传输 这是服务器端的一部分: def serverSocket(): with socket.socket(socket.AF_INET, soc
def serverSocket():
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind(('0.0.0.0', 2048))
s.listen()
conn, addr = s.accept()
print("Connected by {}".format(addr))
with conn:
## Start diffie helman
# generate a list of primes
primes = primesSieve()
# pick g
g = pickPrime(500, primes)
# send g
printDebug("Sending g")
conn.send(bytes(str(g), 'utf-8'))
printDebug("Sent g")
# pick p
p = pickPrime(500, primes, g)
# send p
printDebug("Sending p")
conn.send(bytes(str(p), 'utf-8'))
printDebug("Sent p")
# pick a
a = random.randint(500, 2000)
# calculate A
A = (g**a)%p
# send A
printDebug("Sending A")
conn.send(bytes(str(A), 'utf-8'))
printDebug("Sent A")
# receive B
printDebug("Receiving B")
data = conn.recv(1024) #### This is where the server will stop
printDebug("Received B")
# convert B TODO error checking
B = int(data.decode('utf-8'))
# evaluate key
key = (B**a)%p
这是客户端的一部分:
def clientSocket():
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect(('0.0.0.0', 2048))
## Start diffie helman
# receive g
printDebug("Receiving g")
g = s.recv(1024).decode('utf-8')
printDebug("Received g")
g = int(g)
# receive p
printDebug("Receiving p")
p = s.recv(1024).decode('utf-8')
printDebug("Received p")
p = int(p)
# receive A
printDebug("Receiving A")
data = s.recv(1024) #### This is where the client will stop
printDebug("Received A")
# convert A TODO error checking
A = int(data.decode('utf-8'))
# pick b
b = random.randint(500, 2000)
printDebug(b)
B = (g ** b) % p
printDebug(B)
# send B
printDebug("Sending B")
s.send(bytes(str(B), 'utf-8'))
printDebug("Sent B")
# evaluate key
key = (A ** b) % p
大多数情况下,这项工作都是完美无瑕的。然而,有时当客户端试图接收A时,服务器会发送A,然后继续接收B,但客户端从未接收A,也不会继续
谢谢你的帮助。
此外,我知道这并不是解决Diffie Hellman问题的最佳方法,而且数字还不够大。正如@user207421在他的评论中所说,我已经在阅读它们,因为它收到了不止一条消息。正如@user207421在他的评论中所说,我已经在阅读它们,因为它收到了不止一条消息。数据可能已经读过了。你忽略了所有的阅读计数。啊,当然谢谢你!这就是问题所在。数据可能已经被读取了。你忽略了所有的阅读计数。啊,当然谢谢你!这就是问题所在。