有没有一种方法可以检测传递给已建立连接的函数的socket.socket实例是服务器端套接字(已执行socket.accept())还是客户端套接字(已执行socket.connect())。

基本上,我正在寻找一些东西来检查套接字以实现下面使用的is_server_socket

def func(sock):
    if is_server_socket(sock):
        print("I'm a server!")
    else:
        print("I'm a client!")

最佳答案

一个连接的套接字有一个对等体,而一个未连接的套接字没有一个对等体。因此,您可以使用getpeername来区分已连接和未连接的套接字。

请注意,并非每个未连接的套接字都是服务器套接字。它可能只是一个尚未连接的套接字(即创建了套接字但未调用connect)。但是,如果只需要区分可以在其上调用accept的套接字和作为accept结果而获得的套接字,那么getpeername就足够了。不过,最好还是将此信息保存在局部变量中,而不要一直都调用getpeername,因为这是系统调用,因此比较昂贵。

08-04 15:59