簡體   English   中英

Python socket.recv評估

[英]Python socket.recv evaluation

我正在編寫一個小的python腳本,以便用它來檢查haproxy。 該腳本的作用是連接haproxy套接字並“輪詢”統計信息。

#!/usr/bin/env python

import socket
import sys

my_socket = socket.socket( socket.AF_UNIX, socket.SOCK_STREAM )

try:
  my_socket.connect( "/var/run/haproxy/haproxy.sock" )
except socket.error:
  print "cant connect to socket"
  sys.exit(1)

my_socket.send("show stat\n")
response = my_socket.recv(1024)
print response

我想做的是如果套接字沒有響應,這意味着如果haproxy不輸出統計信息,退出腳本退出代碼(1)。是否可以以某種方式評估是否收到答案?

默認情況下,套接字將處於阻塞模式,並且recv()將阻塞,直到收到數據或關閉連接。

如果您可以假設代理將在一定時間內響應,則可以在客戶端套接字上設置超時。 超時是等待套接字操作完成的秒數。 如果操作未完成,則會引發異常:

my_socket.settimeout(5.0)    # 5 seconds. Set this after connecting.
try:
    response = my_socket.recv(1024)
    print response
except socket.timeout as exc:
    print 'timed out waiting for response from proxy'
    my_socket.close()
    sys.exit(1)

這是一種方式,這可能是最簡單的方法。 您還可以查看select()模塊,該模塊提供的功能將讓您的客戶端等待套接字變為可讀,這表示有數據要讀取,或者套接字已關閉。 這實際上取決於你想要的行為。 使用select()示例:

import select

r, _, _ = select.select([my_socket], [], [], 5.0)
if r:
    response = my_socket.recv(1024)
    print response
else:
    print 'Nothing received from proxy in 5 seconds'
    my_socket.close()
    sys.exit(1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM