Я нашел это и использую его в качестве моей базы, но это не работало правильно из поля. Моя цель состоит в том, чтобы также рассматривать его как пакет вместо утилиты командной строки, таким образом, мои изменения кода отразят это.
class Netcat:
def __init__(self, hostname, port):
self.hostname = hostname
self.port = port
def send(self, content):
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.connect((self.hostname, self.port))
self.socket.setblocking(0)
result = '';
read_ready, write_ready, in_error = select.select([self.socket], [], [self.socket], 5)
if(self.socket.sendall(content) != None):
return
while(1):
buffer = ''
try:
buffer = self.socket.recv(128)
while(buffer != ''):
result += buffer
try:
buffer = self.socket.recv(128)
except socket.error as err:
print (err, type(err))
buffer = ''
if(buffer == ''):
break
except socket.error as err:
print (err, type(err))
if(buffer == ''):
break
return result
Когда я отправляю основную команду на свое устройство, это возвращает следующее.
50PMA-019 Connection Open
Atten #1 = 63dB
Мой код читает первую строку, но тогда я получаю ошибку при высказывании, что соединение временно недоступно, и это не получает вторую строку. Если я изменяю его на блокирование, он просто блоки, и никогда не возвращается. Какие-либо мысли?
Работает ли это, если вы просто используете nc
?
Я думаю, вам стоит попробовать что-нибудь попроще:
import socket
def netcat(hostname, port, content):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((hostname, port))
s.sendall(content)
s.shutdown(socket.SHUT_WR)
while 1:
data = s.recv(1024)
if data == "":
break
print "Received:", repr(data)
print "Connection closed."
s.close()
Я добавил выключение
] звоните, потому что, возможно, ваше устройство ждет, пока вы завершите отправку данных. (Это было бы немного странно, но возможно.)
, если вы не против полностью избавиться от этого кода, вы можете взглянуть на scapy - это, по сути, швейцарский армейский нож пакетных инструментов в Python. посмотрите интерактивное руководство , чтобы узнать, соответствует ли оно вашим потребностям.
если вы хотите что-то более высокоуровневое, чем пакеты twisted - это библиотека для работы в сети. в python ... к сожалению, обучение немного круто.