首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python套接字未传送数据包

Python套接字未传送数据包
EN

Stack Overflow用户
提问于 2019-02-27 12:31:21
回答 1查看 58关注 0票数 1

我正在使用套接字库在Python中创建一个简单的消息传递服务器和客户端。首先,在让用户发送消息之前,我要做一些验证和密钥交换。每隔一段时间,我就会遇到这样的问题:服务器会发送一条消息,而客户端不会接收它,然后服务器会继续尝试接收消息,但客户端仍然会阻塞接收调用,因此它们处于死锁状态。我不明白这是怎么发生的,因为我认为套接字API运行TCP,这应该是保证交付的。

这是服务器端的一部分:

代码语言:javascript
复制
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

这是客户端的一部分:

代码语言:javascript
复制
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时,服务器会发送它,然后继续接收B,但客户端从未接收到A,也不会继续。

谢谢你的帮助。另外,我知道这不是做Diffie Hellman的最好方法,而且数字也不够大。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-28 01:13:47

正如@user207421在他的评论中所说的那样,我已经在阅读它们了,因为它收到了不止一条消息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54898084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档