2016-07-15 15 views
0

Ich nicht, wenn ich das Client-Socket-Handle (conn) wie "conn.close()" schließen muss?Wird TCP Socket Server-Client-Verbindung FD Speicherverlust verursachen?

Wenn ich Multithread ausführen, um den Client-Socket fd (Conn) zu behandeln. Führt es zu einem Speicherverlust, wenn der Server zu lange läuft?

Schließt der Server den Client-Socket fd nicht, wenn Client conn.close() nicht aufruft?

Im Anschluss an meinem tcp-Socket-Server-Code:

# coding: utf-8 

import socket 
import os, os.path 
import time 

sockfile = "./communicate.sock" 

if os.path.exists(sockfile): 
    os.remove(sockfile) 

print "Opening socket..." 

server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) 
server.bind(sockfile) 
server.listen(5) 

print "Listening..." 
while True: 
    conn, addr = server.accept() 
    print 'accepted connection' 
    while True: 
    data = conn.recv(1024) 

    if not data: 
     break 
    else: 
     print "-" * 20 
     print data 
     print "DONE" == data 
     if "DONE" == data: 
      # If I need to invoke conn.close() here? 
      break 
print "-" * 20 
print "Shutting down..." 

server.close() 
os.remove(sockfile) 
print "Done" 

Antwort

2

Nach den document, close aufgerufen wird, wenn die Socket-Müll gesammelt wird. Also, wenn Sie es aus irgendeinem Grund nicht schließen, wäre Ihr Programm wahrscheinlich in Ordnung. Vorausgesetzt, Ihre Socket-Objekte erhalten GCed.

Sie müssen jedoch standardmäßig den Socket schließen oder eine beliebige Ressource freigeben, wenn Ihr Code damit fertig ist.

Für Socket-Objekte in Python Verwaltung Besuche How to use socket in Python as a context manager?

+0

Wenn meine Sprache nicht Python ist, wie C++, weil es keine GC gibt. Muss ich die Cliven-Buchse fd schließen? – scott1028

1

Eine Möglichkeit ist, um herauszufinden, um es zu testen und zu sehen! Hier ist ein kleines Python-Skript, das ich auf meinem Mac (OS X 10.11.5) ausgeführt habe. Wenn ich die holdSockets.append() -Zeile abnehme, wird dieses Skript nach dem Erstellen von 253-Sockets fehlerhaft ("socket.error: Too many open files"). Wenn ich jedoch die Zeile holdSocket.append() auskommentiert lasse, damit die Sockets mit Garbage Collection behandelt werden können, wird das Skript ohne Fehler endlos ausgeführt.

#!/bin/python 

import socket 
import time 

count = 0 

holdSockets = [] 

while True: 
    count += 1 
    nextSock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) 
    #holdSockets.append(nextSock) 
    time.sleep(0.1) 
    print "Created %i sockets" % count 
+0

Danke! Es ist eine gute Idee, GC zu testen. – scott1028