Python-сокет не доставляет пакет - PullRequest
0 голосов
/ 27 февраля 2019

Я создаю простой сервер обмена сообщениями и клиент на Python, используя библиотеку сокетов.Сначала я делаю некоторую проверку и обмен ключами, прежде чем позволить пользователю отправлять сообщения.Время от времени я получаю сообщение о том, что сервер отправит сообщение, а клиент не получит его, а затем сервер будет пытаться получить сообщение, но клиент все еще блокирует входящий вызов, поэтому онив тупике.Я запутался, как это происходит, потому что я думал, что API сокетов запускает TCP, который должен гарантировать доставку.

Это часть серверной части:

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, сервер отправляет его, затем переходит к получению B, но клиент никогда не получает A и не идет дальше.

Спасибо за любую помощь.Кроме того, я знаю, что это действительно не лучший способ сделать Диффи Хеллман, и что цифры не достаточно велики.

1 Ответ

0 голосов
/ 27 февраля 2019

Как сказал @ user207421 в своем комментарии, я уже читал их, потому что он получал более одного сообщения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...