Решено: сетевое программирование в Python (и мои нубские вопросы)

Модератор: Модераторы разделов

sbar
Сообщения: 354
ОС: Gentoo

Решено: сетевое программирование в Python

Сообщение sbar »

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

Код:

#!/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" ничего не говорит сервер снова можно запускать.
вопросы:
0. у меня код не верно написан, в клиентской части нужно что-то еще перед выходом делать или нет (или наоборот в серверной)?
1. это вообще нормально, что клиент может помешать запуску сервера? 0_o

а теперь совсем нубский вопрос: все эти сокеты вообще где создаются, в оперативке? как создать сокет-файл (у которого еще права на "s" начинаются) и работать с ним (ткинте меня носом в простой пример что ли)? в мануале я нашел что-то про AF_UNIX, но как им пользоваться мне не найти что-то.
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Решено: сетевое программирование в Python

Сообщение v04bvs »

у тебя сервер на закрывает сокет, поэтому порт не сразу освобождается. Клиент не при чём. Ещё на эту тему можно почитать про SO_REUSEADDR

все эти сокеты вообще где создаются,

В структурах ядра, которые хранятся в оперативной памяти.
Спасибо сказали:
sbar
Сообщения: 354
ОС: Gentoo

Re: Решено: сетевое программирование в Python

Сообщение sbar »

v04bvs писал(а):
06.09.2007 21:27
у тебя сервер на закрывает сокет
а как же "server.close()" (оно ведь должно вызываться при KeyboardInterrupt)? попробовал еще "sock.close()" дописать - тоже самое.
Спасибо сказали:
un-defined
Сообщения: 145
ОС: Kubuntu, Gentoo

Re: Решено: сетевое программирование в Python

Сообщение un-defined »

Pr0b3L писал(а):
06.09.2007 20:24
как создать сокет-файл (у которого еще права на "s" начинаются) и работать с ним (ткинте меня носом в простой пример что ли)? в мануале я нашел что-то про AF_UNIX, но как им пользоваться мне не найти что-то.


http://symmetrica.net/unix-linux
часть 4 соответственно
Это конечно не python, но про сокеты хорошо написано
Don`t try - just do or do not ©Master Joda
Спасибо сказали:
sbar
Сообщения: 354
ОС: Gentoo

Re: Решено: сетевое программирование в Python

Сообщение sbar »

un-defined писал(а):
06.09.2007 22:22
Это конечно не python, но про сокеты хорошо написано
угу. и ничего не понятно.
приведите кто-нибудь простой пример с AF_UNIX кто-нить плиз, гугл никак не дает ответ. :(
и почему в моем коде сокет не закрывается все-таки? я так и не понял.

v04bvs писал(а):
06.09.2007 21:27
SO_REUSEADDR
как с ним в python работать? сделал такое

Код: Выделить всё

server = socket.socket(socket.AF_INET, socket.SO_REUSEADDR)
и получаю такое

Код: Выделить всё

socket.error: (95, 'Operation not supported')


UPD: все проблемы решены, тут помогли :)
Спасибо сказали: