如何在Python

时间:2016-02-10 15:30:36

标签: python sockets verify

我有一个可以调用socket.close()来终止连接的函数,我想检查它是否确实如此。 (我说的是我的剧本 - 如果它在另一端关闭的话) 出于某种原因,socket._closed仍会返回Falsesocket._connected会返回True

尝试读/写抛出

  

*** ValueError:读取已关闭或未打开的SSL套接字。“

但我想验证没有尝试/除(这是非常混乱)。 E.g:

sock.close()
if sock.is_closed:
    do_something()

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

来自When to not just use socket.close()

def recv_end(the_socket):
    End='SERVER WRONG MARKER'
    total_data=[];data='';got_end=False
    while True:
            data=the_socket.recv(8192)
            if not data: break
            if End in data:
                total_data.append(data[:data.find(End)])
                got_end=True
                break
            total_data.append(data)
            if len(total_data)>1:
                #check if end_of_data was split
                last_pair=total_data[-2]+total_data[-1]
                if End in last_pair:
                    total_data[-2]=last_pair[:last_pair.find(End)]
                    total_data.pop()
                    got_end=True
                    break
    return (got_end,''.join(total_data))

def basic_server(sock):
    got=[]
    got_end,data = recv_end(sock)
    if not got_end:  
        sock.send('ERROR:no end!') #<--- not possible w/close()
    else: sock.sendall(data*2)
    sock.shutdown(1)
    sock.close()

import socket
Port=4444
def start_server():
    sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    sock.bind(('',Port))
    sock.listen(5)
    print 'started on',Port
    while True:
        newsock,address=sock.accept()
        basic_server(newsock)

def send_data(data):
    sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    sock.connect(('localhost',Port))
    print 'connected'
    sock.sendall(data+'CLIENT WRONG MARKER')
    print 'sent',data
    sock.shutdown(1)
    print 'shutdown'
    result=[]
    while True:
       got=sock.recv(2)
       if not got: break
       result.append(got)
    sock.close()
    return ''.join(result)

if __name__=='__main__':
    start_server()

更简单,更小的解决方案

如果通过“this end”表示服务器端,this answer应该有帮助。如果您的意思是客户端,则this answer中的以下代码应该有效。