Форум сайта python.su
А есть ли в сокетах функция передающяя и приниающяя что-то иное кроме строки, например кортеж или список, или былобы класно еслиб вообще фаил.
Отредактировано (Авг. 20, 2010 18:07:48)
Офлайн
есть ещё вопрос, если например к серверуподключаются 2 пользователя. по 1 порту они подключится не могут, как только подключится 2 , первого немедленно вышвырнет. Поэтому я создал 2 порта. Но клиент то 1. Поэтому клиент содержис тписок портов( покачто только 2) к которым он будет пробовать подключатся. Но вот незадача, если порт занят, то клиент спокойно подключается и выкидывает прошлого клиента, и даже ничего по этому поводу не говорит. Как проверить Занят ли порт и если он занят перейти к проверке другого
Офлайн
Alex_Kutsan
На уровне сокетов нет понятий строка, список, файл. Почитайте немного теории об OSI: http://ru.wikipedia.org/wiki/Сетевая_модель_OSI
Офлайн
Alex_Kutsanсервер создает соединение на одном порту и к нему могут подключаться куча клиентов одновременно, и они не выпинывают друг друга.
есть ещё вопрос, если например к серверуподключаются 2 пользователя. по 1 порту они подключится не могут, как только подключится 2 , первого немедленно вышвырнет. Поэтому я создал 2 порта. Но клиент то 1. Поэтому клиент содержис тписок портов( покачто только 2) к которым он будет пробовать подключатся. Но вот незадача, если порт занят, то клиент спокойно подключается и выкидывает прошлого клиента, и даже ничего по этому поводу не говорит. Как проверить Занят ли порт и если он занят перейти к проверке другого
Офлайн
АГА, спасибо, теперь ещё 1 нюанс, как узнать адрес того от кого пришло сообщение, т.к функция
recvfrom(1024) почемуто выдаёт:
(сообщение, None)
Офлайн
sock, addr = srv.accept() # ВТОРОЙ параметр
Офлайн
Это при установке соединения, а если соединение уже давно установлено, и к серверу подключены много клиентов. Как узнать адрес того кто прислал мне что-то? ну или почму эта функция recvfrom() выдаёт None вместо адреса?
Офлайн
Alex_Kutsanсделай словарь и туда складывай { “сокет”:“адрес” }, получении данных recv() ты указываешь сокет, таким образом будешь знать адрес.
Это при установке соединения, а если соединение уже давно установлено, и к серверу подключены много клиентов. Как узнать адрес того кто прислал мне что-то? ну или почму эта функция recvfrom() выдаёт None вместо адреса?
Офлайн
recvfrom - для UDP.
Поможет .getpeername()
Но она на самом деле вам не нужна.
.accept(), как уже было указано, возвращает сокет для работы с подключившимся клиентом и адрес этого самого удаленного конца.
Все дальнейшее общение идет через этот новый сокет. Таким образом клиенты никогда не перепутаются.
Офлайн