rukia
Интересующийся
Offline
|
|
« : 26-04-2010 09:56 » |
|
Добрый день) есть клиент UDP-чата. он бесконечно слушает сервер на предмет входящих сообщений (recvfrom), а если пользователь нажимает, например, клавишу "enter", то клиенту следует через тот же самый сокет сделать sendto();
все почему-то говорят про потоки. Но это же легче сделать без потоков?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #1 : 26-04-2010 10:09 » |
|
rukia, можно и без потоков. Работать тоже будет. Но не всегда легче, кстати, без отдельного потока)
|
|
|
Записан
|
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #2 : 26-04-2010 11:01 » |
|
В чем вопрос то?
Чем обусловлен выбор UDP протокола?
|
|
|
Записан
|
С уважением Lapulya
|
|
|
rukia
Интересующийся
Offline
|
|
« Ответ #3 : 26-04-2010 11:51 » |
|
выбор протокола обусловлен заданием. А вот если с 2 потоками: тогда они одновременно: один - слушает сервер while(1) {...recvfrom();...}, второй - клавиатуру while(1) {fgets(&buff[0],sizeof..,stdin); sendto();..}. Так? Мне не особо доводилось работать с потоками. вы не знаете, учитывая, что они отправляют/посылают через один и тот же порт - у них будет состояние гонок?. Т.е. нужно ли мне над этим думать или планировщик заданий для процессора сам не допустит некорректрого отрабатывания их?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #4 : 27-04-2010 05:22 » |
|
rukia, нужно сделать синхронизацию потоков, например применить критическую секцию
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #5 : 27-04-2010 05:42 » |
|
Эх сто лет уже сети не юзал Если правильно думаю, в recvfrom указывается порт (локальный) на котором ты хочешь получить данные, а sendto указывается порт (принимающей стороны), на который хочешь отправить данные. Если всё так, то проблем никаких нет, и ничего синхронизировать не надо.
|
|
« Последнее редактирование: 27-04-2010 05:46 от resource »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #6 : 27-04-2010 06:34 » |
|
resource, он из двух источников данные получает )
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #7 : 27-04-2010 06:49 » |
|
всмысле с клавы и с сокета? ну и что? тем более в разных потоках
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #8 : 27-04-2010 07:02 » |
|
а, сорри, я прочитал неправильно. Я понял так, что обрабатываются данные в одной процедуре. А так да - сам UDP порт синхронизировать не нужно
|
|
|
Записан
|
|
|
|
rukia
Интересующийся
Offline
|
|
« Ответ #9 : 28-04-2010 07:08 » |
|
Ага, опыт показал, что все хорошо работает без синхронизации. Извиняюсь, глуповатый был вопрос
|
|
|
Записан
|
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #10 : 04-05-2010 07:58 » |
|
ну, то что (1) у тебя, (2) сейчас все работает хорошо без синхронизации ни о чем не говорит. Чтобы точно сказать нужна синхронизация или нет, надо знать, что ты конкретно написал. Ну например, в твоем чате скорее всего используется вывод на экран сообщений как самого пользователя, так и сообщений пришедших по сети и если выводом занимается один и тот же объект, то без синхронизации могут быть проблемы. А таких потенциально опасных случаев в твоей программе может быть море, так что надо копать в сторону синхронизации потоков.
|
|
|
Записан
|
С уважением Lapulya
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #11 : 04-05-2010 19:31 » |
|
Я вот, например, представляю себе всё так. Один поток получает данные с одного сокета, который собственно предназначен для приема, и выводит эти данные в общее окно (в простейшем случае) чата. Другой поток принимает данные введенные пользователем, отправляет их по другому сокету (для отправки) и выводит в то же окно. Что тут с чем синхронизировать? О каких объектах речь, тоже неясно.
|
|
|
Записан
|
|
|
|
rukia
Интересующийся
Offline
|
|
« Ответ #12 : 18-05-2010 01:35 » |
|
resource, у меня грубее было - сокет и на отправку и на прем один. То ись, я догадываюсь, что в серьезном приложении лучше 2 сокета, но для мня чат просто лаба по не очень интересному предмету был. В любом случае, синхронизации не надо, да. Ну например, в твоем чате скорее всего используется вывод на экран сообщений как самого пользователя, так и сообщений пришедших по сети у меня все, включая сообщения пользователя, приходило по сети, путешествуя через серверр ))
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #13 : 18-05-2010 15:03 » |
|
Ну 2 сокета только потому, что на одном то постоянно надо ждать входящих сообщений. В любом случае, синхронизации не надо, да.
Ну если и так всё работает, то не надо.
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #14 : 18-05-2010 15:15 » |
|
В отдельном исходящем сокете есть смысл - для удобства. Например, UDP-сокету можно сказать connect(...) - также, как и TCP-сокету. И он при этом запомнит адрес и порт назначения и можно слать данные почти так же, как через обычный потоковый сокет (например, в *nix можно использовать read/write).
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #15 : 18-05-2010 19:53 » |
|
Я, честно говоря, давно не писал ничего прикладного, но если правильно помню (а это вопрос), то UDP сокет тоже блокируется когда recvfrom вызываешь? Ну если конечно специально не переводить его в nonblocking.
|
|
« Последнее редактирование: 18-05-2010 19:55 от resource »
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #16 : 18-05-2010 19:58 » |
|
Конечно блокируется.
Кстати, тут все таки о какой реализации сокетов идет речь? О POSIX или winsock?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #17 : 19-05-2010 06:29 » |
|
Конечно блокируется
Во. Я вот так и подумал, поэтому и не понял как вообще всё это сделать на одном сокете, опять же если не настроить его как неблокирующийся.
|
|
|
Записан
|
|
|
|
|