Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: сокеты UDP  (Прочитано 20385 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
rukia
Интересующийся

ru
Offline Offline

« : 26-04-2010 09:56 » 

Добрый день) есть клиент UDP-чата. 
он бесконечно слушает сервер на предмет входящих сообщений (recvfrom), а если пользователь нажимает, например, клавишу "enter", то клиенту следует через тот же самый сокет сделать sendto();

все почему-то говорят про потоки. Но это же легче сделать без потоков?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 26-04-2010 10:09 » 

rukia, можно и без потоков. Работать тоже будет. Но не всегда легче, кстати, без отдельного потока)
Записан

lapulya
Молодой специалист

ru
Offline Offline

« Ответ #2 : 26-04-2010 11:01 » 

В чем вопрос то?

Чем обусловлен выбор UDP протокола?
Записан

С уважением Lapulya
rukia
Интересующийся

ru
Offline Offline

« Ответ #3 : 26-04-2010 11:51 » 

выбор протокола обусловлен заданием.

А вот если с 2 потоками: тогда они одновременно: один - слушает сервер  while(1) {...recvfrom();...}, второй - клавиатуру while(1) {fgets(&buff[0],sizeof..,stdin); sendto();..}. Так? Мне не особо доводилось работать с потоками.  Скромно так...  вы не знаете, учитывая, что они отправляют/посылают через один и тот же порт - у них будет состояние гонок?. Т.е. нужно ли мне над этим думать или планировщик заданий для процессора сам не допустит некорректрого отрабатывания их?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 27-04-2010 05:22 » 

rukia, нужно сделать синхронизацию потоков, например применить критическую секцию
Записан

resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 27-04-2010 05:42 » 

Эх сто лет уже сети не юзал  Улыбаюсь

Если правильно думаю, в recvfrom указывается порт (локальный) на котором ты хочешь получить данные, а sendto указывается порт (принимающей стороны), на который хочешь отправить данные. Если всё так, то проблем никаких нет, и ничего синхронизировать не надо.
« Последнее редактирование: 27-04-2010 05:46 от resource » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 27-04-2010 06:34 » 

resource, он из двух источников данные получает )
Записан

resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 27-04-2010 06:49 » 

всмысле с клавы и с сокета? ну и что? тем более в разных потоках
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 27-04-2010 07:02 » 

а, сорри, я прочитал неправильно. Я понял так, что обрабатываются данные в одной процедуре. А так да - сам UDP порт синхронизировать не нужно
Записан

rukia
Интересующийся

ru
Offline Offline

« Ответ #9 : 28-04-2010 07:08 » 

Ага, опыт показал, что все хорошо работает без синхронизации.
Извиняюсь, глуповатый был вопрос  На память
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #10 : 04-05-2010 07:58 » 

ну, то что (1) у тебя, (2) сейчас все работает хорошо без синхронизации ни о чем не говорит. Чтобы точно сказать нужна синхронизация или нет, надо знать, что ты конкретно написал. Ну например, в твоем чате скорее всего используется вывод на экран сообщений как самого пользователя, так и сообщений пришедших по сети и если выводом занимается один и тот же объект, то без синхронизации могут быть проблемы. А таких потенциально опасных случаев в твоей программе может быть море, так что надо копать в сторону синхронизации потоков. 
Записан

С уважением Lapulya
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 04-05-2010 19:31 » 

Я вот, например, представляю себе всё так. Один поток получает данные с одного сокета, который собственно предназначен для приема, и выводит эти данные в общее окно (в простейшем случае) чата. Другой поток принимает данные введенные пользователем, отправляет их по другому сокету (для отправки) и выводит в то же окно. Что тут с чем синхронизировать? О каких объектах речь, тоже неясно.
Записан
rukia
Интересующийся

ru
Offline Offline

« Ответ #12 : 18-05-2010 01:35 » 

resource, у меня грубее было - сокет и на отправку и на прем один. То ись, я догадываюсь, что в серьезном приложении лучше 2 сокета, но для мня чат  просто лаба по не очень интересному предмету был. В любом случае, синхронизации не надо, да.

Цитата
Ну например, в твоем чате скорее всего используется вывод на экран сообщений как самого пользователя, так и сообщений пришедших по сети
у меня все, включая сообщения пользователя, приходило по сети, путешествуя через серверр ))
Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 18-05-2010 15:03 » 

Ну 2 сокета только потому, что на одном то постоянно надо ждать входящих сообщений.

Цитата: rukia
В любом случае, синхронизации не надо, да.

Ну если и так всё работает, то не надо.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 18-05-2010 15:15 » 

В отдельном исходящем сокете есть смысл - для удобства. Например, UDP-сокету можно сказать connect(...) - также, как и TCP-сокету. И он при этом запомнит адрес и порт назначения и можно слать данные почти так же, как через обычный потоковый сокет (например, в *nix можно использовать read/write).
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 18-05-2010 19:53 » new

Я, честно говоря, давно не писал ничего прикладного, но если правильно помню (а это вопрос), то UDP сокет тоже блокируется когда recvfrom вызываешь?
Ну если конечно специально не переводить его в nonblocking.
« Последнее редактирование: 18-05-2010 19:55 от resource » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #16 : 18-05-2010 19:58 » 

Конечно блокируется.

Кстати, тут все таки о какой реализации сокетов идет речь? О POSIX или winsock?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 19-05-2010 06:29 » 

Цитата: RXL
Конечно блокируется

Во. Я вот так и подумал, поэтому и не понял как вообще всё это сделать на одном сокете, опять же если не настроить его как неблокирующийся.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines