Как получить IP-адрес клиента после установления соединения в программировании сокета Python? - PullRequest
0 голосов
/ 07 февраля 2019

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

Я пробовал функцию .getpeername (), но получаю ошибку

#host = '10.66.227.181'   # fixed ip of one client only
client_socket = socket.socket()
host = client_socket.getpeername()
print(clientip)
port = 8000
print(host,port)
client_socket.connect(host,port)

clientip = socket.gethostname (client_socket.getpeername ()) OSError: [WinError 10057] Запрос на отправку или получениеданные были запрещены, поскольку сокет не подключен и (при отправке на сокет дейтаграммы с использованием вызова sendto) адрес не был указан

Ответы [ 2 ]

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

Вот пример из книги «Основы сетевого программирования Python» о сокетах udp (как на стороне сервера, так и на стороне клиента), и я думаю, что этот пример будет вам полезен:

import argparse, socket
from datetime import datetime

MAX_BYTES = 65535

def server(port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.bind(('127.0.0.1', port))
    print('Listening at {}'.format(sock.getsockname()))
    while True:
        data, address = sock.recvfrom(MAX_BYTES)
        text = data.decode('ascii')
        print('The client at {} says {!r}'.format(address, text))
        text = 'Your data was {} bytes long'.format(len(data))
        data = text.encode('ascii')
        sock.sendto(data, address)

def client(port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    text = 'The time is {}'.format(datetime.now())
    data = text.encode('ascii')
    sock.sendto(data, ('127.0.0.1', port))
    print('The OS assigned me the address {}'.format(sock.getsockname()))
    data, address = sock.recvfrom(MAX_BYTES)  # Danger! See Chapter 2
    text = data.decode('ascii')
    print('The server {} replied {!r}'.format(address, text))

if __name__ == '__main__':
    choices = {'client': client, 'server': server}
    parser = argparse.ArgumentParser(description='Send and receive UDP locally')
    parser.add_argument('role', choices=choices, help='which role to play')
    parser.add_argument('-p', metavar='PORT', type=int, default=1060,
                        help='UDP port (default 1060)')
    args = parser.parse_args()
    function = choices[args.role]
    function(args.p)

источник

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

Если UDP-сокет не подключен, одноранговый узел отсутствует.Так что не может быть одноименного имени.И если он подключен, вы уже знаете, как вы подключили его.

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(host,port)
host, port = client_socket.getpeername()
...