Python 持久化套接字连接
我刚开始学Python :) 我想创建一个持久的socket连接。我尝试用文件描述符来实现这个目标。我的尝试步骤是:
打开一个socket连接
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
获取它的文件描述符编号
fd = s.fileno()
将文件描述符作为输入输出打开
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 个回答
如果你想根据命令行中接收到的参数(也就是那个套接字)来重新创建一个套接字,可以使用 socket.fromfd
。
你可以使用 os.fdopen() 来打开文件描述符。
其实我很惊讶你能做到这一点,因为 os.open
需要一个文件名 和 一些标志来说明你想以什么模式打开这个文件。例如,fd = os.open('foo.txt', os.O_RONLY)
。正如我的例子所示,它是 返回 一个文件描述符,而不是接受一个文件描述符。