1

我正在与之通信的服务器具有流会话槽,有时流会话无法打开,因为所有流会话槽都已使用。我怀疑它是因为我正在构建一个与服务器对话的程序,并且当我 cntrl-c 强制停止流时它不会安全关闭,从而保持流会话插槽为服务器上的实例连接打开。所以当我终止程序几十次时,这个错误就会累积起来

我对 Python Networking 知之甚少,不知道 cntrl-c 是否像敲击键并调用方法 close_conn(sock) 一样干净,但我想尝试一下。

假设我在我的终端上运行它”

 ...
    print("Now listening from server for data...\n")
      while True:

        received = sock.recv(1024) 

        #pseudo_code
        if (user_input == "e") close_conn(sock) 

出于调试目的,如何安全地关闭连接?

4

3 回答 3

1

如果你想在按下“Ctrl + C”时关闭你的套接字,然后等待另一个连接,你可以试试下面的代码。

while True:
    try:
        received = sock.recv(1024)
    except KeyboardInterrupt:
        print "i want to close client socket"
        sock.close()
        break
    except socket.error, e:
        print "a socket erro has occured, e = ", e
        break
于 2016-07-21T03:34:24.580 回答
0

使用您所说的代码

“你想试试...given code...

. 你快到了,只需要一条额外的线。见下文。

...
print("Now listening from server for data...\n")
while True:

    received = sock.recv(1024)  

    # code
    if user_input == "e":
        break #breaks out of while loop and calls close_conn(sock)
close_conn(sock) 

从您的代码中,我假设close_conn(sock)是一个调用 的函数sock.close()user_input是一个变量,当它等于 时"e",它会中断循环以关闭套接字。

于 2016-11-02T15:51:38.333 回答
0

重新阅读您的问题后,我想我回答了其他问题。对不起。

我不知道您是否正确识别了问题的根源,但是您可以将代码放入try...except...finally...结构中。如果您不需要其中之一,您可以省略exceptor 。finally

例如:

from time import sleep
try:
    sleep(10)
except KeyboardInterrupt:
    print "This line is printed only if Ctrl+C was pressed"
finally:
    print "This line is printed even if Ctrl+C was pressed"
于 2016-07-21T02:59:47.587 回答