首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TCP套接字服务器客户端连接fd会导致内存泄漏吗?

TCP套接字服务器客户端连接fd会导致内存泄漏吗?
EN

Stack Overflow用户
提问于 2016-07-15 10:13:19
回答 2查看 1.3K关注 0票数 0

如果我需要关闭客户端套接字句柄( conn ),比如"conn.close()“,我就不需要了?

如果我运行多线程来处理客户端套接字fd ( conn )。服务器运行时间过长会不会造成内存泄漏?

如果客户端没有调用conn.close(),服务器会不会关闭客户端套接字fd?

以下是我的tcp套接字服务器代码:

代码语言:javascript
复制
# 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"
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-15 10:31:07

根据documentclose在套接字被垃圾回收时被调用。因此,如果您没有关闭它,无论出于什么原因,您的程序可能是正常的。假设你的套接字对象得到了GCed。

但是,作为标准实践,当您的代码使用完套接字时,您必须关闭套接字或释放任何资源。

有关在Python中管理套接字对象的信息,请查看How to use socket in Python as a context manager?

票数 2
EN

Stack Overflow用户

发布于 2016-07-15 13:04:59

找出答案的一种方法是测试并查看!下面是我在Mac (OS X 10.11.5)上运行的一个小Python脚本。如果我取消注释holdSockets.append()行,此脚本在创建253个套接字后会出错("socket.error: Too open open files")。但是,如果我将holdSockets.append()行注释掉,以便可以对套接字进行垃圾回收,脚本将无限期运行,不会出现任何错误。

代码语言:javascript
复制
#!/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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38386870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档