如何使用主动/被动主机在Python中打开套接字?

时间:2016-06-09 16:03:45

标签: python sockets

我的目标是使用Up的主机打开套接字。

我的初始代码只有一个主机:

!/usr/bin/python

import socket

def Socket(host, port):
     # create socket
     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     try:
             s.connect((str(host), port))
     except Exception as e:
             print("Error Socket not open")

     # Request
     Request = "GET services\n"

     # Send
     s.sendall(Request)
     s.shutdown(socket.SHUT_WR)
     data = ""
     while 1:
             buf = s.recv(255)
             if not buf:
                     break
             data += buf
      s.close()
     table = [ line.split(';') for line in data.split('\n')[:-1] ]
     return table;

我通过

调用此函数
    Socket('myhost1', 50000)

我想使用类似的东西:

    Socket(['myhost1','myhost2'], 50000)

如果函数无法使用myhost打开套接字,我想使用myhost2打开套接字。

如果套接字无法使用myhost1打开,如何进行测试?

THX

1 个答案:

答案 0 :(得分:1)

一个简单的解决方案是简单地循环主机,并使用第一个成功的连接。

def Socket(hosts, port):
    # create socket
    sock = connect(hosts, port)

    # Send
    Request = "GET services\n"
    sock.sendall(Request)
    sock.shutdown(socket.SHUT_WR)
    data = ""
    while 1:
        buf = sock.recv(255)
        if not buf:
            break
        data += buf
    sock.close()
    table = [line.split(';') for line in data.split('\n')[:-1]]
    return table


def connect(hosts, port):
    for host in hosts:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        try:
            sock.connect((str(host), port))
        except socket.error:
            # Unable to establish a connection, lets move on to the next host.
            continue
        return sock
    raise Exception('Unable to establish connection')

在新的connect方法中,我们基本上尝试建立连接,如果失败,请尝试第二个地址。如果所有地址都失败,只需引发异常。