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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: сокеты UDP  (Прочитано 20461 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
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 » 

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

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

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

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

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

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

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

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

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

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

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines