2

ソケットを使用してサーバー/クライアント接続を確立しようとしています。しかし、それらは適切に閉じず、その理由について頭を悩ませることはできません。

更新 1

質問で s.close 関数を実際に呼び出していないという私の愚かな間違いを修正しました。しかし、これは私の問題ではないことが判明しました。

アップデートの終了

これは私のサーバーコードです:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import socket
import sys

if __name__ == '__main__':
    # Server connection
    s = socket.socket()          # Create a socket object
    host = socket.gethostname()  # Get local machine name
    port = 12345                 # Reserve a port for your service.

    print 'Server started!'
    print 'Waiting for clients...'

    s.bind((host, port))        # Bind to the port
    s.listen(5)                 # Now wait for client connection.
    c, addr = s.accept()     # Establish connection with client.
    print 'Got connection from', addr
    msg = c.recv(1024)

    print addr, ' >> ', msg

    if msg == 'close':
        print 'Closing down'
        c.send('SENT: Closing down')

    c.shutdown(socket.SHUT_RDWR)
    c.close()

これは私のクライアントコードです:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import socket

if __name__ == '__main__':
    # Server
    s = socket.socket()          # Create a socket object
    host = socket.gethostname()  # Get local machine name
    port = 12345                 # Reserve a port for your service.

    print 'Connecting to ', host, port
    s.connect((host, port))

    msg = raw_input('CLIENT >> ')
    s.send(msg)
    msg = s.recv(1024)
    print 'SERVER >> ', msg

    s.close()                     # Close the socket when done

そして、これはそれが生成するエラーメッセージです:

In [13]: %run cjboxd.py
Server started!
Waiting for clients...
---------------------------------------------------------------------------
error                                     Traceback (most recent call last)
/usr/lib/python2.7/dist-packages/IPython/utils/py3compat.pyc in execfile(fname, *where)
    173             else:
    174                 filename = fname
--> 175             __builtin__.execfile(filename, *where)

/home/nine/slask/cjboxd.py in <module>()
     19     print 'Waiting for clients...'
     20 
---> 21     s.bind((host, port))        # Bind to the port
     22     s.listen(5)                 # Now wait for client connection.
     23     c, addr = s.accept()     # Establish connection with client.

/usr/lib/python2.7/socket.pyc in meth(name, self, *args)
    222 
    223 def meth(name,self,*args):
--> 224     return getattr(self._sock,name)(*args)
    225 
    226 for _m in _socketmethods:

error: [Errno 98] Address already in use

1分後に動作します。

4

3 に答える 3

9

あなたが必要ですsocket.socket.setsockopt、.ies.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

プロセスが終了すると、ソケットは OS によって閉じられますが、明示的に close() を呼び出すのは良い動作です。ただし、その後、ローカル アドレス (local_ip, local_port) は 2MSL(maximum segment lifetime)が経過するまで使用できません。なんで?私たちに何ができるでしょうか?これらを読むことができます:

http://www.tcpipguide.com/free/t_TCPConnectionTermination-3.htm およびhttp://www.unixguide.net/network/socketfaq/4.5.shtml

彼らよりも明確に投稿するのは難しいでしょう:)。

于 2012-09-17T11:16:12.173 に答える
8
s.close                     # Close the socket when done

あなたは実際には何も呼び出さないので私の目に突き出ています、あなたは試してみるべきですs.close()

于 2012-09-17T11:15:28.403 に答える
3

s.closeの代わりに、を呼び出していますs.close()

クライアントに接続を終了させたい場合は、socket.close()メソッドを呼び出す必要があります。`

于 2012-09-17T11:15:42.397 に答える