Постоянное соединение сокета Python

Я новичок в python :) Я хотел бы создать постоянный сокет. Я пытался сделать это с помощью файловых дескрипторов. Что я пробовал:

  1. Откройте сокетное соединение s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

  2. Получить номер дескриптора файла fd = s.fileno()

  3. Откройте файловый дескриптор как I/O os.open(fd)

Но я получаю OSError: [Errno 9] Bad file descriptor

Я сказал, что я новичок в python и, возможно, я ошибаюсь в реализации. Но я попробовал более простой пример os.close(s.fileno()) и получил ту же ошибку OSError: [Errno 9] Bad file descriptor

Я нашел пример написанный на ruby ​​и протестировал его, он работает. Как создать постоянные сетевые сокеты в Unix в Руби?

Может ли кто-нибудь написать это на 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 удаляет мусор после закрытия скрипта. Как это решить на питоне?


person Andrew    schedule 19.09.2010    source источник
comment
Эндрю, обратите внимание, что пример ruby, который вы публикуете, не делает того, что вы хотите. Он ловит SIGINT и тут же возрождается. Это отличается от смерти, ожидания десяти секунд, а затем ожидания того, что python (если не ОС) не восстановил дескриптор файла. Это не говоря уже о том, что процесс, которому пример ruby ​​передает файловый дескриптор, является подпроцессом файла, который открывает сокет.   -  person aaronasterling    schedule 20.09.2010


Ответы (2)


Вы используете os.fdopen() для открытия файловых дескрипторов.

Я на самом деле удивлен, что вы зашли так далеко, потому что os.open требует имени файла и флагов, указывающих, в каком режиме открывать файл. например, fd = os.open('foo.txt', os.O_RONLY). Как показывает мой пример, он возвращает файловый дескриптор, а не принимает его.

person aaronasterling    schedule 19.09.2010

Если вы хотите заново создать сокет по параметру, полученному в командной строке (т. е. по сокету), используйте socket.fromfd

person Jim Brissom    schedule 19.09.2010