第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

套接字斷開連接后,有沒有辦法在 Python 中獲取對等名()?

套接字斷開連接后,有沒有辦法在 Python 中獲取對等名()?

Qyouu 2021-09-11 18:27:34
我有一個像這樣的簡單服務(wù)器:#!/usr/bin/env python2import socketserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server.bind(('localhost', 50000))server.listen(5)# Set TCP Keepaliveserver.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)server.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, 1)server.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, 3)server.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, 5)connection, client_address = server.accept()while True:    try:        data = connection.recv(1024)    except socket.error:        print "%s dropped out" % (connection.getpeername(),)        break    if data:        print "%s: %s" % (connection.getpeername(), data)    else:        print "%s disconnected" % (connection.getpeername(),)        break我使用 TCP Keepalive 來確定客戶端是否消失(而不是正確斷開連接)。我看到的問題是,當一個客戶端確實消失了,并且我捕獲了 socket.error 異常時,我的打印語句會嘗試通過使用 connection.getpeername() 來確定哪個客戶端斷開連接,這不再有效。它拋出一個socket.error: [Errno 107] Transport endpoint is not connected例外。在這個簡單的例子中,任何時候只有一個客戶端可以連接,但是如果有更復(fù)雜的代碼同時處理多個客戶端,知道哪個客戶端退出可能會很有用。一旦套接字斷開連接,是否無法知道它之前連接到哪個端點?為什么即使在客戶端斷開連接后,connection對象也不保留客戶端的 IP/端口信息connection.getpeername()?這是因為該connection對象可能是可重用的嗎?我怎樣才能讓我的代碼真正工作,并打印出哪個客戶端退出了?我是否需要將 的輸出存儲connection.getpeername()在一個變量中,以便我以后可以調(diào)用它?這意味著如果我有多個客戶端,我需要將connection.getpeername()每個客戶端的值存儲在列表中嗎?我知道使用socket是相當?shù)图壍?,而且我很確定實際使用SocketServer.TCPServer會更容易 - 我只是想了解所涉及的低級網(wǎng)絡(luò)。
查看完整描述

1 回答

?
阿波羅的戰(zhàn)車

TA貢獻1862條經(jīng)驗 獲得超6個贊

不幸的是,這是操作系統(tǒng)界面的限制。在已知套接字已斷開連接后,二進制 (C) 程序也將無法獲得對等名稱。這是一種不幸的疣。您不能將套接字重新用于新連接,因此我沒有充分的理由想出為什么無法檢索對等名稱的原因,但是......它不能。


第一個想法是使用單獨dict的套接字對象作為鍵,通過它您可以查找關(guān)聯(lián)的客戶端地址:


saved_addr = {}

...

connection, client_address = server.accept()

saved_addr[connection] = client_address`

while True:

    try:

        data = connection.recv(1024)

    except socket.error:

        print("{} disconnected".format(saved_addr[connection]))

其次是創(chuàng)建一個單獨的類來包裝套接字。該類可以保存您從中獲得的對等地址,accept并在需要時將其返回給您。同時,它可以透明地將所有其他操作委托給底層套接字。


示范:


import socket

import time


class ConnectedSocket:

    def __init__(self, sock, peer):

        self.sock = sock

        self.peer = peer

    def get_peer(self):

        return self.peer

    def __getattr__(self, name):

        return getattr(self.sock, name)


def run_server(port):

    server = socket.socket()

    server.bind(('', port))

    server.listen(5)


    while True:

        csock, addr = server.accept()

        csock = ConnectedSocket(csock, addr)

        print("Accepted from {}".format(addr))


        while True:

            time.sleep(.5)

            try:

                csock.send(b'Hello')

            except socket.error as err:

                print("Error {} sending to peer {}".format(err, csock.get_peer()))

                csock.close()

                break


run_server(9999)


查看完整回答
反對 回復(fù) 2021-09-11
  • 1 回答
  • 0 關(guān)注
  • 238 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號