Python 持久化套接字连接

2 投票
2 回答
3894 浏览
提问于 2025-04-16 04:20

我刚开始学Python :) 我想创建一个持久的socket连接。我尝试用文件描述符来实现这个目标。我的尝试步骤是:

  1. 打开一个socket连接 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

  2. 获取它的文件描述符编号 fd = s.fileno()

  3. 将文件描述符作为输入输出打开 os.open(fd)

但是我遇到了错误 OSError: [Errno 9] Bad file descriptor

我说过我刚开始学Python,可能我的实现有问题。但我尝试了一个更简单的例子 os.close(s.fileno()),结果也得到了同样的错误 OSError: [Errno 9] Bad file descriptor

我找到一个用Ruby写的例子并测试了,结果是可以的。 如何在Unix中用Ruby创建持久的网络socket?

有没有人能帮我把这个用Python写出来,我想实现的是: socket_start.py google.com (这会打印出fd编号) sleep 10 socket_write.py fd_number 'something' sleep 10 socket_read.py fd_number 1024

我希望你能理解我想做的事情。谢谢你的帮助!


在你们的回复后,我尝试了下面的代码:

1

#!/usr/bin/python

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('google.com', 80))
s.send('GET /\n')
print s.fileno()

2

#!/usr/bin/python

import os
import sys

fd = int(sys.argv[1])
os.read(fd, 1024)

但是错误依然是 OSError: [Errno 9] Bad file descriptor

我知道问题出在哪里(我是一名PHP开发者)。我觉得和PHP一样,Python在关闭脚本后会清理垃圾。那我该如何在Python中解决这个问题呢?

2 个回答

0

如果你想根据命令行中接收到的参数(也就是那个套接字)来重新创建一个套接字,可以使用 socket.fromfd

1

你可以使用 os.fdopen() 来打开文件描述符。

其实我很惊讶你能做到这一点,因为 os.open 需要一个文件名 一些标志来说明你想以什么模式打开这个文件。例如,fd = os.open('foo.txt', os.O_RONLY)。正如我的例子所示,它是 返回 一个文件描述符,而不是接受一个文件描述符。

撰写回答