Netcat在Python中的实现

发布于 2021-01-29 18:39:31

我找到了并以它为基础,但它开箱即用时却无法正常工作。我的目标也是将其视为程序包而不是命令行实用程序,因此我的代码更改将反映出来。

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

我的代码读取第一行,但是随后出现错误消息,表明连接暂时不可用,并且没有获得第二行。如果我将其更改为阻塞,它只会阻塞并且永远不会返回。有什么想法吗?

关注者
0
被浏览
53
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    如果您只使用它是否有效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()
    

    shutdown之所以加入此通话,是因为您的设备可能正在等待您说完数据发送。(这有点奇怪,但是有可能。)



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看