2

私は最近、いくつかのソケットを使用して作業しており、リッスン ソケットを使用していくつかの単体テスト ケースを作成しているときに、繰り返しerror: [Errno 98] Address already in use.

これは、エラーを示すコードの例です。

import unittest
import socket

class TestUnit(unittest.TestCase):
    def setUp(self):
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socket.bind((socket.gethostname(), 10000))
        self.socket.listen(10)
        self.addCleanup(self.clean)

    def test_nothing(self):
        self.assertEqual(False, False)

    def test_something(self):
        self.assertEqual(True, True)

    def clean(self):
        self.socket.close()

テストの 1 つが例外をスローしたときに発生するようです。例外なく、期待どおりに動作します。しかし、最初に例外をスローした後のすべてのテストも例外をスローするため、そのようなテストは役に立たなくなります。

4

1 に答える 1

1
socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) 

助けるべき

基本的に、閉じたソケットはスタックによってすぐに解放されません。したがって、それをすぐに再利用しようとすると (バインド ソケットが 1 つしかなく、アプリケーションを閉じて再起動するシナリオでも)、同じエラーが表示されます。REUSEADDR を使用すると、同じソケットを再度バインドできます。

ただし、ソケットが時限待機状態にあり、同じ宛先を試行すると、失敗します。

また、このソケット オプションのマニュアル ページを読んで、その制限を理解する必要があります。

SO の SO_REUSEADDR

于 2012-10-15T18:44:51.517 に答える