Socket.Accept принимает навсегда и неблокирующая ошибка возврата - PullRequest
0 голосов
/ 26 мая 2019

У меня проблемы с запуском кода, который просто подключается к моему собственному IP-адресу. Функция socket.send работает просто отлично, но для работы socket.accept требуется слишком много времени. Кто-нибудь может мне помочь? Это, вероятно, простой ответ, которого я еще не видел, так как мне всего 13.

Я проверил правильность порта, отсканировав его с помощью другого кода, и запустил его на Python IDLE и в терминале Mac. Я пробовал «www.google.com», «localhost», «», «127.0.0.1» и мой личный IP-адрес, но socket.accept по-прежнему не работает

Код: код сканера, возвращает 20000, ака не нашел порт

import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
for port in range(0,20001):
    try:
        s.setblocking(False)
        s.bind(('127.0.0.1',port))
        s.listen(1);
        c,addr=s.accept()
        break
    except:
        if port%1000==0:
            print(port)

принять код:

import socket
s=socket.socket(socket.AF_UNIX,socket.SOCK_DGRAM);
s.setblocking(False)
s.bind(('127.0.0.1',20000))
s.listen(1);
c,addr=s.accept()

Я хочу, чтобы код подтверждения ничего не возвращал, а сканер возвращал число от 0 до 20000. Это мой первый пост о переполнении стека, поэтому, пожалуйста, скажите, что лучше сделать в моем следующем посте (:

1 Ответ

0 голосов
/ 27 мая 2019

Эта строка неверна для получения входящего TCP-соединения:

s=socket.socket(socket.AF_UNIX,socket.SOCK_DGRAM);

Вместо этого должно быть:

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);

Кроме того, s.setblocking(False), вероятно, не то, что вы хотите сделать, поскольку вы, вероятно, хотите, чтобы accept() блокировался до получения входящего TCP-соединения.

Обновление: помимо проблемы, описанной выше, другая проблема заключается в том, что предполагаемый код сканирования портов, размещенный в вопросе, нефактически не сканирует никакие порты, поскольку он никогда не пытается установить исходящее TCP-соединение.Для справки, вот версия этого кода, которая на самом деле пытается подключиться к портам 0-20000 на локальном хосте, а затем распечатывает, к каким портам удалось установить соединение:

import socket

connectedPorts = []
for port in range(0,20001):
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
    try:
        s.connect(('127.0.0.1',port))
        print("Connect succeeded on port %i" % port)
        connectedPorts.append(port)
    except Exception as e:
        print "Port %i: %s" % (port, e)
    s.close()

print("")
print("Connect succeeded on the following ports: ", connectedPorts)

... идля полноты вот рабочий код accept-on-port-20000:

import socket

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.bind(('127.0.0.1',20000))
s.listen(1);
print("Calling accept...")
c,addr=s.accept()
print("Accept returned: [%s, %s]" % (c,addr))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...