首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python socket编程中,如何在建立连接后获取客户端的Ip地址?

问在python socket编程中,如何在建立连接后获取客户端的Ip地址?
EN

Stack Overflow用户
提问于 2019-02-07 14:27:34
回答 3查看 14K关注 0票数 5

我写了一个套接字程序来发送文件并从套接字接收字符串,我在其中指定了客户端(写入了客户端的ip地址)我想动态地获取客户端地址,我尝试了.getpeername()函数,但得到了错误

我尝试了.getpeername()函数,但遇到错误

代码语言:javascript
复制
#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调用在数据报套接字上发送时)未提供地址

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-02-07 14:40:33

如果UDP套接字未连接,则没有对等方。所以不能有对等名称。如果它已连接,则您已经知道如何将其连接到。

代码语言:javascript
复制
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(host,port)
host, port = client_socket.getpeername()
票数 7
EN

Stack Overflow用户

发布于 2019-02-07 14:44:13

下面是“Python网络编程基础”一书中关于udp套接字(服务器端和客户端)的例子,我认为这个例子会对你有用:

代码语言:javascript
复制
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)

source

票数 2
EN

Stack Overflow用户

发布于 2021-07-15 12:44:09

由于“主机”的术语,上面的答案会让大多数人感到困惑,所以这里有一个更好的答案:

ip_address = my_socket.getpeername()[0]

其中my_socket是您已经设置和连接的插座的句柄。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54567493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档