新手:保持TCP套接字打开[英] Newbie: Keep TCP socket open

问题描述

大家好,
我是 Python 的新手,但已经成功创建了一个简单的客户端和
服务器设置,不过我有一个问题.

我正在尝试通过发送许多 TCP 连接(WHILE 循环)来测试一个盒子,但不是
用 FIN/RST 关闭它们.但是,无论我做什么,我都无法得到
循环停止从客户端发送 FIN.

有什么线索吗?

这是我当前的脚本

#!/usr/bin/python

导入socket,sys
numpy 导入 *
num1=0

而 (num1<=10) :

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(10.0)
s.connect(("10.1.1.69", 50008)) # SMTP
打印 s.recv(1024) + ''\n'',
数1=数1+1
#s.close()
sys.exit(1)

推荐答案

5 月 19 日上午 10:25,"Alan Wright"<alan.wri...@volubill.com 写道:
大家好,
我是 Python 的新手,但已经成功创建了一个简单的客户端和
服务器设置,不过我有一个问题.

我正在尝试通过发送许多 TCP 连接(WHILE 循环)来测试一个盒子,但不是
用 FIN/RST 关闭它们.但是,无论我做什么,我都无法得到
循环停止从客户端发送 FIN.

有什么线索吗?

这是我当前的脚本

#!/usr/bin/python

导入socket,sys
从 numpy 导入 *
num1=0

而 (num1<=10) :

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(10.0)
s.connect(("10.1.1.69", 50008)) # SMTP
打印 s.recv(1024) + ''\n'',
数1=数1+1
#s.close()

系统退出(1)
socket.socket 实例在
对象被破坏(在这种情况下,当它是垃圾时它被破坏-
集).发生的事情是,在每次迭代中,变量
引用 socket.socket 实例的"s"被分配给一个新的
socket.socket 实例,因此是前一个的实例
迭代不再被"s"引用,因为它不再是
被任何东西引用,实例被垃圾回收,
自动对该实例强加一个隐式 close() .一个简单的
解决方案可能是创建一个列表并附加 socket.socket
每次迭代到该列表的实例,这样实例将
保持在列表中的引用并且不被垃圾收集;虽然你
或许能找到更优雅的解决方案.

塞巴斯蒂安


Alan Wright 写道:
而 (num1<=10) :

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(10.0)
s.connect(("10.1.1.69", 50008)) # SMTP
打印 s.recv(1024) + ''\n'',
数1=数1+1
#s.close()
系统退出(1)
我认为正在发生以下情况:
为每个新套接字重用"s"对象将使 Python 成为垃圾
收集以前的.垃圾收集套接字可能会关闭()它.
同样在创建所有套接字后,您的程序将退出.我猜是 Python 还是
操作系统本身将关闭所有套接字.
尝试将您创建的每个新套接字放入一个大列表中,这样 Python 就不能
垃圾收集它.最后让你的程序进入休眠状态.

进口时间
allsockets=[]

而(...):
s=socket.socket(...
allsockets.append(s)
s.settimeout(...
...

time.sleep(99999)

--irmen

感谢您的反馈.

在列表中使用套接字很棒

但是,正如我想象的那样,在
系统崩溃了,我也注意到了,端口循环回到 1025
当他们达到5000时.

关于如何使列表/套接字达到 50K 左右的任何想法

TIA

艾伦
<s0****@gmail.com 在留言中写道
新闻:e8************************************@c58g2000 hsc.googlegroups.com...
5 月 19 日上午 10 点 25 分,"艾伦·赖特"<alan.wri...@volubill.com 写道:
>大家好,
我是 Python 新手,但已经成功创建了一个简单的客户端和
服务器设置,但我遇到了一个问题.

我正在尝试测试一个通过发送许多 TCP 连接(WHILE 循环)而不是
用 FIN/RST 关闭它们.但是,无论我做什么,我都无法让

循环停止从客户端发送 FIN.

有什么线索吗?

这里是我当前的脚本

#!/usr/bin/python

import socket,sys
from numpy import *
num1=0

while (num1<=10) :

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(10.0)
s.connect(("10.1.1.69", 50008)) # SMTP
print s.recv(1024) + ''\n'',
num1=num1+1
#s.close()

sys.exit(1)

socket.socket 实例在
对象被破坏(在这种情况下,当它是垃圾时它被破坏-
集).发生的事情是,在每次迭代中,变量
引用 socket.socket 实例的"s"被分配给一个新的
socket.socket 实例,因此是前一个的实例
迭代不再被"s"引用,因为它不再是
被任何东西引用,实例被垃圾回收,
自动对该实例强加一个隐式 close() .一个简单的
解决方案可能是创建一个列表并附加 socket.socket
每次迭代到该列表的实例,这样实例将
保持在列表中的引用并且不被垃圾收集;虽然你
或许能找到更优雅的解决方案.

塞巴斯蒂安


本文地址:https://www.itbaoku.cn/post/1050846.html