Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如果需要重复使用同一端口,如何正确关闭套接字?_Python 3.x_Sockets_Tcp_Server - Fatal编程技术网

Python 3.x 如果需要重复使用同一端口,如何正确关闭套接字?

Python 3.x 如果需要重复使用同一端口,如何正确关闭套接字?,python-3.x,sockets,tcp,server,Python 3.x,Sockets,Tcp,Server,我创建了一个服务器程序和一个客户端程序,其中我的目标是让客户端发送服务器TCP数据包。在我的例子中,客户机得到了服务器的IP地址和数据包应该发送到的端口。如果我第一次为特定端口运行服务器代码,服务器程序将搜索响应。如果我运行它两次或两次以上,就会得到错误“地址已在使用”。似乎插座没有正确关闭 如我的代码所示,我在程序结束时尝试了sock.shutdown()和sock.close(),但都没有成功。我也尝试过添加connection.close()和sock.setsockopt(),但是,我相

我创建了一个服务器程序和一个客户端程序,其中我的目标是让客户端发送服务器TCP数据包。在我的例子中,客户机得到了服务器的IP地址和数据包应该发送到的端口。如果我第一次为特定端口运行服务器代码,服务器程序将搜索响应。如果我运行它两次或两次以上,就会得到错误“地址已在使用”。似乎插座没有正确关闭

如我的代码所示,我在程序结束时尝试了sock.shutdown()和sock.close(),但都没有成功。我也尝试过添加connection.close()和sock.setsockopt(),但是,我相信我可能混淆了Python2和Python3的语法。(我使用的是Python 3)添加或删除这些方法会导致相同的错误。我已经发布了下面的服务器代码以供参考

import socket

# TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)


# Bind the socket to the port
server_address = ('10.0.2.6', 2104)
print('Starting up {} port {}'.format(*server_address))
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # Allows address to be reused
sock.bind(server_address)

# Listen for incoming connections, looking for one connection.
sock.listen(1) # The number of queried connections.

while True:
    # Wait for a connection
    print('waiting for a connection')
    connection, client_address = sock.accept()
    try:
        print('connection from', client_address)

        # Receive the data in small chunks and then send back
        while True:
            data = connection.recv(90)
            print('received {!r}'.format(data))
            if data:
                print('sending data back to the client')
                connection.sendall(data)
                break

            else:
                print('no data from', client_address)
                break

    finally:

        print("Closing current connection") # Cleans up the connection
        connection.close()
        sock.shutdown(socket.SOCK_STREAM, socket.AF_NET)
        sock.shutdown(1)
        sock.close()
我希望该程序继续以多次执行的方式监听同一部分。但是,运行此代码一次就会出现错误

socket.error: [Errno 98] Address already in use.

这不是关于如何关闭它,而是关于如何打开它。在绑定它之前,需要在侦听套接字上设置SO_REUSEADDR选项。@user207421只是为了确保SO_REUSEADDR在Python 3中有效吗?我将翻转bind和listen方法。通过执行sock.listen(),我是否已经像几行之前那样设置了SO_REUSEADDR选项?编辑:实际上刚刚在sock.bind()之前测试了sock.listen()。我得到[Errno 22]无效的参数我不懂Python,但如果它不受支持,我会感到惊讶。不,
listen()。你不能在绑定之前听。不知道您为什么要尝试它:它毫无意义。@user207421我对Python有点陌生。我想你是说在监听套接字上设置SO_REUSEADDR选项意味着监听在绑定之前进行。无论如何,我不是已经在第10行设置了正确的袜子选项吗?我没有遵循逻辑。
sock.shutdown(socket.sock\u STREAM,socket.AF\u NET)
没有任何意义,将在运行时引发属性错误异常。我猜发布的代码不是您实际运行的代码。它不是关于如何关闭它,而是关于如何打开它。在绑定它之前,您需要在侦听套接字上设置SO_REUSEADDR选项。@user207421只是为了确保SO_REUSEADDR在Python 3中有效吗?我将翻转bind和listen方法。通过执行sock.listen(),我是否已经像几行之前那样设置了SO_REUSEADDR选项?编辑:实际上刚刚在sock.bind()之前测试了sock.listen()。我得到[Errno 22]无效的参数我不懂Python,但如果它不受支持,我会感到惊讶。不,
listen()。你不能在绑定之前听。不知道您为什么要尝试它:它毫无意义。@user207421我对Python有点陌生。我想你是说在监听套接字上设置SO_REUSEADDR选项意味着监听在绑定之前进行。无论如何,我不是已经在第10行设置了正确的袜子选项吗?我没有遵循逻辑。
sock.shutdown(socket.sock\u STREAM,socket.AF\u NET)
没有任何意义,将在运行时引发属性错误异常。我猜发布的代码不是您实际运行的代码。