【问题标题】:Detect if a Python socket.socket instance is a server or a client without knowing beforehand?在事先不知道的情况下检测 Python socket.socket 实例是服务器还是客户端?
【发布时间】:2016-12-26 21:49:39
【问题描述】:

有没有办法检测传递给已经建立连接的函数的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!")

【问题讨论】:

  • 如果您使用的是 UDP,则没有服务器或客户端套接字的概念。如果您使用 TCP,您可能应该检查代码的逻辑,因为拥有一个接受服务器或客户端套接字但区分两者的函数几乎没有意义。
  • @ValentinLorentz 这只是 TCP。我正在创建的接口使用类似于 HTTP/2 的“流 ID”,并且为了避免流 ID 重叠,强制客户端或服务器实例为奇数或偶数流 ID。我的接口对外部代码一无所知,只知道传递给它的套接字。请不要质疑我的问题。相反,如果有答案,请集中精力寻找答案。

标签: python sockets server


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    • 2022-01-07
    相关资源
    最近更新 更多