Найти - Пользователи
Полная версия: сервер не закрывает сокет перед выходом? + вопрос по unix-sockets
Начало » Network » сервер не закрывает сокет перед выходом? + вопрос по unix-sockets
1
sbar
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, если что.
slivlen
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()
sbar
ух ты как оперативно! большущее спасибо :)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB