Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Network
  • » сервер не закрывает сокет перед выходом? + вопрос по unix-sockets [RSS Feed]

#1 Сен. 8, 2007 08:52:33

sbar
От:
Зарегистрирован: 2007-08-15
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

сервер не закрывает сокет перед выходом? + вопрос по unix-sockets

1. Пишу простенький сервер:

#!/bin/env python
# -*- coding: utf-8 -*-
HOST = ''
PORT = 20123
from socket import socket
from time import strftime
server = socket()
server.bind((HOST, PORT))
try:
   while 1:
      server.listen(1)
      sock, address = server.accept()
      data = sock.recv(1024)
      if data=='gettime':
         print 'sending time'
         sock.send(strftime('%k:%M:%S'))
      sock.close()
except:
   server.close()
и клиент к нему
#!/bin/env python
# -*- coding: utf-8 -*-
HOST = ''
PORT = 20123
from socket import socket
client = socket()
client.connect((HOST, PORT))
client.send('gettime')
data = client.recv(1024)
client.close()
if data: print data
запускаю сервер. запускаю клиент. все нормально.
останавливаю сервер. запускаю сервер и получаю такое
Traceback (most
recent call last):
File "./server.py", line 11, in ?
server.bind((HOST, PORT))
File "<string>", line 1, in bind
socket.error: (98, 'Address already in use')
а “netstat | grep 20123” говорит
tcp		0	  0 desktop.localdoma:20123 desktop.localdomai:4543 TIME_WAIT
причем подобных строк появляется ровно столько, сколько раз запускался клиент.
через какое-то время “netstat | grep 20123” ничего не говорит сервер снова можно запускать.
пробовал еще sock.close() в ветви except дописывать, но помоему это только лишнее
слышал что нужно использовать SO_REUSEADDR но я не понимаю как. вот такой код
server = socket.socket(socket.AF_INET, socket.SO_REUSEADDR)
выдает: “socket.error: (95, ‘Operation not supported’)”.

2. как создать и работать с unix-сокетами (сокеты-файлы)? на сколько я понял нужно ковырять в сторону AF_UNIX, но как им пользоваться я так и не понял, или ищу я плохо.

ОС - Linux, если что.



Отредактировано (Сен. 8, 2007 08:56:33)

Офлайн

#2 Сен. 8, 2007 10:36:28

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

сервер не закрывает сокет перед выходом? + вопрос по unix-sockets

Pr0b3L
2. как создать и работать с unix-сокетами (сокеты-файлы)? на сколько я понял нужно ковырять в сторону AF_UNIX, но как им пользоваться я так и не понял, или ищу я плохо.
Работа с ними почти ничем не отличается от работы с tcp сокетами. Отличия только в параметрах конструктора сокета и подключения.
Создание серверной части:
from socket import *
uds_path = '/tmp/myuds'
uds = socket(AF_UNIX, SOCK_STREAM)
uds.bind(uds_path)
# Дальше все аналогично tcp серверу
uds.listen(1)
...
Клиентская часть:
uds=socket(AF_UNIX, SOCK_STREAM)
uds.connect(uds_path)
# Дальше все аналогично tcp клиенту
...
P.S. В качестве примера можешь посмотреть класс StreamMonitorClient здесь. Работает как с UDS , так и с tcp сокетами.

Что касается первого вопроса, то ты не верно устанавливаешь параметры сокета. Вот пример твоего сервера с изменениями:
#!/bin/env python
# -*- coding: utf-8 -*-
 
HOST = ''
PORT = 20123
 
import socket
from time import strftime
 
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind((HOST, PORT))
 
try:
   while 1:
      server.listen(1)
      sock, address = server.accept()
      data = sock.recv(1024)
      if data=='gettime':
         print 'sending time'
         sock.send(strftime('%k:%M:%S'))
finally:
   server.close()



Офлайн

#3 Сен. 8, 2007 11:16:41

sbar
От:
Зарегистрирован: 2007-08-15
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

сервер не закрывает сокет перед выходом? + вопрос по unix-sockets

ух ты как оперативно! большущее спасибо :)



Офлайн

  • Начало
  • » Network
  • » сервер не закрывает сокет перед выходом? + вопрос по unix-sockets[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version