Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по UDP чату. 
:(
    Опции темы
KPEHDEL
Дата 22.9.2012, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 31.3.2010

Репутация: нет
Всего: нет



Здравствуйте. Делаю UDP чат. Возник вопрос как лучше отправить сообщение всем.

Допустим в чате авторизовались(послали логин/пароль) 3 пользователя. Записывать адрес каждого и потом в цикле с помощью sendto отправлять каждому? Ведь UDP не устанавливает соединение.

Или как это делают нормальные люди?)
PM MAIL WWW ICQ   Вверх
tzirechnoy
Дата 22.9.2012, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 2
Всего: 16



У меня есть одна шутка про UDP. Но, боюсь, она до вас не дойдёт...
PM MAIL   Вверх
KPEHDEL
Дата 22.9.2012, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 31.3.2010

Репутация: нет
Всего: нет



Цитата

У меня есть одна шутка про UDP. Но, боюсь, она до вас не дойдёт...


Мог бы и написать, раз уж постишь. Может дошла бы) Я не совсем тупой как бы) Протокол, вроде знаю.

Это сообщение отредактировал(а) KPEHDEL - 22.9.2012, 15:47
PM MAIL WWW ICQ   Вверх
tzirechnoy
Дата 22.9.2012, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 2
Всего: 16



Цитата
 Может дошла бы


Ужэ не дошла, успокойтесь.
PM MAIL   Вверх
KPEHDEL
Дата 22.9.2012, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 31.3.2010

Репутация: нет
Всего: нет



tzirechnoy, дошло только после того как разжували)

Вопрос актуален.
Сейчас записываю адреса авторизовавшихся в sockaddr_in users_online_addr[10]; И потом в цыкле отправляю.
Но это ведь не нормально да?

Это сообщение отредактировал(а) KPEHDEL - 23.9.2012, 10:56
PM MAIL WWW ICQ   Вверх
feodorv
Дата 22.9.2012, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(KPEHDEL @  22.9.2012,  20:34 Найти цитируемый пост)
users_online_addr[10];

Если у Вас ограничение в 10 пользователей, то почему не использовать TCP?

Добавлено через 2 минуты и 22 секунды
Цитата(KPEHDEL @  22.9.2012,  20:34 Найти цитируемый пост)
Но это ведь не нормально да? 

Всё зависит от логики, которую Вы хотите воплотить. 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
volatile
Дата 22.9.2012, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(KPEHDEL @  22.9.2012,  15:46 Найти цитируемый пост)
Мог бы и написать, раз уж постишь. Может дошла бы) Я не совсем тупой как бы) 

KPEHDEL, тут шутка юмора заключалась в том что она не дошла бы до вас не потому что вы тупой, а потому, что протокол UDP не дает никаких гарантий (в отличии от TCP) по доставке пакетов.

еще из приблизительно такого типа юмора, что запомнилось:
Всех людей можно разделить ровно на три категории: тех кто считать умеет, и тех кто не умеет.
ну и т.д.


PM MAIL   Вверх
borisbn
Дата 23.9.2012, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Ещё есть: люди делятся на 10 категорий - те кто понимает двоичную систему и тех, кто нет


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
semibug
Дата 23.9.2012, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



Сервер какой-то предусматривается?

Отправить можно по очереди всем через sendto, как извращение - использовать мульти и широковещательные пакеты.

По поводу гарантии доставки UDP сообщений - в локалке скорее всего потерь не будет (если нет переходов 10/100/1000 на узлах и приложений забивающих каналы).
Если гарантии нужны, рекомендую попридумывать какой-то механизм подтверждений, в течении 2 дней, потом посмотреть на TCP.



Это сообщение отредактировал(а) semibug - 23.9.2012, 10:05
PM   Вверх
KPEHDEL
Дата 23.9.2012, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 31.3.2010

Репутация: нет
Всего: нет



Спасибо за шутки)
Цитата

Если у Вас ограничение в 10 пользователей, то почему не использовать TCP?

Ограничение не в 10 пользователей. Просто пока написал столько.

Цитата

Если гарантии нужны, рекомендую попридумывать какой-то механизм подтверждений, в течении 2 дней, потом посмотреть на TCP.

В моей задаче больше подходит UDP. Полная гарантия доставки не нужна, так как если пакет будет доставлен сильно позже, он уже не будет нужен. 

Цитата

Сервер какой-то предусматривается?

Да, сервер предусматривается, работать должно не только в локалке.

Цитата

Отправить можно по очереди всем через sendto, 

Пока так и сделал, но это не красиво.

Цитата

как извращение - использовать мульти и широковещательные пакеты


Пойду подробнее читать об этом.

Спасибо за ответы, если будут ещё варианты, пишите.

Интересно как же делают в онлайн играх сделанных на udp, думаю там не отправляют по очереди в цикле с помощью sendto smile 
PM MAIL WWW ICQ   Вверх
tzirechnoy
Дата 23.9.2012, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 2
Всего: 16



Именно отправляют, именно в цыкле (ну, с некоторым распараллеливанием, которое распараллеливание вообще, и не зависит от sockets). 
Мультикаст, по сути, пока не работает -- то есть если это полностью твоя сеть, с твоими роутерами и свитчами, и у тебя есть власть над админами конечных точек -- то есть шанс это настроить. Если клиент, который владеет сетью и конечными точками, готов заплатить тебе 100500 баксов за твоё решэние -- тожэ. В средне-нормальной IP-сети -- нет, он просто не работает.
Броадкаст -- это в рамках одного сегмента сети, и поэтому ни для чего кроме настройки сети в этом сегменте неприспособлен.

Добавлено через 2 минуты и 25 секунд
И самое важное: дажэ локальная сеть с 1% потерь -- это хреновенькая локальная сеть, но работающая и встречающаяся нередко. 0.1% потерь -- это сплошь и рядом. Если не хочешь, чтобы каждая 300-я фраза молча пролетала мимо клиента -- надо что-то делать.
PM MAIL   Вверх
KPEHDEL
Дата 23.9.2012, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 31.3.2010

Репутация: нет
Всего: нет



Ну в принципе представление я получил, то есть если ориентация не только на сеть, то в цикле и с распараллеливанием.

Цитата

Если не хочешь, чтобы каждая 300-я фраза молча пролетала мимо клиента -- надо что-то делать. 

Что-то делать для уменьшения вероятности потери нужного пакета в любом случаи прийдётся, но это уже немного позже. 

Спасибо за ответы. smile 
PM MAIL WWW ICQ   Вверх
feodorv
Дата 23.9.2012, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(KPEHDEL @  23.9.2012,  11:55 Найти цитируемый пост)
В моей задаче больше подходит UDP.

Пожалуйста, объясните, почему. И как Вы хотите реализовать отсоединение клиента от чат-сервера.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Леопольд
Дата 23.9.2012, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(KPEHDEL @  23.9.2012,  10:55 Найти цитируемый пост)
В моей задаче больше подходит UDP.

Видеочат - конференция? Если просто текст, тогда непонятно почему UDP лучше.



--------------------
вопросов больше чем ответов
PM MAIL   Вверх
KPEHDEL
Дата 23.9.2012, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 31.3.2010

Репутация: нет
Всего: нет



Цитата

Пожалуйста, объясните, почему. И как Вы хотите реализовать отсоединение клиента от чат-сервера. 


Цитата

Видеочат - конференция? Если просто текст, тогда непонятно почему UDP лучше.


В универе скоро будет задание, сделать мини игру на сокетах. Ориентация при моём выборе идёт не на чат, просто решил, что стоит начать с консольного чата.

Выбрал UDP в основном из-за быстроты и гибкости. Про все его минусы знаю, про то, что нет гарантии доставки, произволный порядок передачи данных, размножение и т.д.
В мини-игре, которую я буду реализовывать, если пакет прийдёт позже он попросту не будет нужен. Следовательно гарантия доставки не нужна, нужна скорость.

Конечно, скорей всего я встречу подзадачу, в которой вероятность потери должна быть минимальна, и было бы интересно, попробовать своять велосипед самому. Ведь это весело и хардкорно. 

Возможно буду использовать UDP совместно с TCP, для разных подзадач. Также сейчас читаю о RUDP.

Кстате моё мнение, что именно для чата, TCP подошёл бы больше, так как в чате важнее не скорость, а гарантия. Возможно для чата его и буду использовать.

Однако сейчас работаю с UDP, следовательно вопросы пока о UDP.

Цитата

И как Вы хотите реализовать отсоединение клиента от чат-сервера. 

Со стороны клиента при отправке соответствующей команды.
Со стороны сервера, в качестве проверки, отправка клиенту запроса(не один раз), на который клиент должен ответить, иначе дисконнект.

В догонку задам маленький вопрос:
Сделал два потока, чтобы приём и отправка сообщений не мешали друг другу.
Функция потока:
Код

static unsigned __stdcall ThreadFunc( void* pArguments ) {
    while( 1 ) {
        cout<<"S<=C: "<<endl;
        cin>>Winsock.buff;
        Winsock.Sending_to_server();
        
        Sleep(20);
    }

    _endthreadex( 0 );
    return 0;



Метод в котором вызывается второй поток:
Код

int Winsock::messaging() {
    // Create the second thread.
    HANDLE hThread = (HANDLE)_beginthreadex( NULL, 0, &ThreadFunc, NULL, 0, NULL );    
    
    CloseHandle( hThread );

    while( 1 ) {
        cout<<"test"<<endl;
        Reception_from_server();
        cout<<"S=>C: "<<&buff[0]<<endl;
        Sleep(20);
    }
    
    return 0;
}


Так вот, созданный второй поток работает нормально.
А цикл while в отвечающий за приём работает не нормально, нельзя сказать, что не работает вовсе.
Происходит следующее:
Сначала 1 раз выводится test.
А потом работает только второй поток. Иначе бы сообщением "test" заспамило, а также я получал бы сообщения от сервера.

Подскажите пожалуйста в чём дело. Заранее спасибо.

PS: Наверное тему правильнее было создать в разделе C/C++: Сети. Если так перенесите пожалуйста.

Это сообщение отредактировал(а) KPEHDEL - 23.9.2012, 22:20
PM MAIL WWW ICQ   Вверх
KaZepKa
Дата 24.9.2012, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 29.10.2011

Репутация: нет
Всего: нет



корейцы мутят ммохи на TCP и тащат)  UDP не очень, просто он проще
PM MAIL   Вверх
feodorv
Дата 24.9.2012, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(KPEHDEL @  23.9.2012,  23:15 Найти цитируемый пост)
Подскажите пожалуйста в чём дело.
  • от сервера не приходят пакеты
  • ошибка в коде Reception_from_server()
Я склоняюсь к первому варианту...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
KPEHDEL
Дата 24.9.2012, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 31.3.2010

Репутация: нет
Всего: нет



Цитата

корейцы мутят ммохи на TCP и тащат)  UDP не очень, просто он проще


Предпочитаю брать пример с valve, Blizzard и т.д. Из не популярных могу привести игру War§ow, надо отдать должное реализованной замечательной синхронизации.

Цитата

UDP не очень, просто он проще


Не совсем... Если делать что-то серьёздное на UDP, то простоты будет мало и прийдётся делать велосипеды. А это отнюдь не проще.

Цитата

Я склоняюсь к первому варианту...

Ошибка была во втором варианте(может и не только), спасибо за ответ. Странно, что я сам не усмотрел. 

Это сообщение отредактировал(а) KPEHDEL - 24.9.2012, 16:04
PM MAIL WWW ICQ   Вверх
KPEHDEL
Дата 24.9.2012, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 31.3.2010

Репутация: нет
Всего: нет



Только вот не пойму в чём она заключается.
Есть метод Authorisation.Auth(); - он запрашивает логин и пароль пользователя, отправляет серверу, если логин и пароль верны, сервер отвечает. При этом используется та же самая Reception_from_server().
В Reception_from_server() сделал несколько cout для наглядности:
Код

/*### Прием сообщения с сервера ###*/
int Winsock::Reception_from_server() {
    cout<<"start"<<endl;
        server_addr_size = sizeof(server_addr);
        
        n = recvfrom(my_sock, &buff[0], sizeof(buff) - 1, 0, (sockaddr *)&server_addr, &server_addr_size);

        if( n == SOCKET_ERROR ) {
            cout<<"recvfrom() error: %d\n"<<WSAGetLastError()<<endl;
            close();
            return -1;
        }

        buff[n] = 0;

    cout<<buff<<endl;
    cout<<"The End Reception_from_server()"<<endl;

    return 0;
}


 Что мы видим:
Пользователь вводит логин пароль, вызывается:
Код

Sending_to_server();
Reception_from_server();
//без лишнего кода


В консоль при вызове Reception_from_server() выводит:
Код

start
A1 - это нам прислал сервер в качестве подтверждения авторизации.
The End Reception_from_server()

Reception_from_server()  - отработала успешно.
Далее вызывается Winsock.messaging();.
Которую я приводил ранее.
Консоль выводит:
Код

test - из while в messaging().
start - из Reception_from_server().

Если закоментить вызов Reception_from_server(), то оба потока работают правильно.
Таки понятно, что стопится на строчке 
Код

n = recvfrom(my_sock, &buff[0], sizeof(buff) - 1, 0, (sockaddr *)&server_addr, &server_addr_size);

(Дополнительный поток отвечающий за ввод, само собой это никак не задевает)
Но не понятно почему, ведь при предыдущем вызове отработала правильно.

С нетерпением жду вариантов.

Это сообщение отредактировал(а) KPEHDEL - 25.9.2012, 10:29
PM MAIL WWW ICQ   Вверх
Леопольд
Дата 24.9.2012, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



...

Это сообщение отредактировал(а) Леопольд - 24.9.2012, 21:38


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
feodorv
Дата 25.9.2012, 02:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(KPEHDEL @  24.9.2012,  19:10 Найти цитируемый пост)
        n = recvfrom(my_sock, &buff[0], sizeof(buff) - 1, 0, (sockaddr *)&server_addr, (int *)sizeof(&server_addr));

Цитата(KPEHDEL @  24.9.2012,  19:10 Найти цитируемый пост)
n = recvfrom(my_sock, &buff[0], sizeof(buff) - 1, 0, (sockaddr *)&server_addr, &server_addr_size);

Не знаю, какому коду верить, но (int *)sizeof(&server_addr) - конструкция-катастрофа.


Цитата(KPEHDEL @  24.9.2012,  19:10 Найти цитируемый пост)
Но не понятно почему, ведь при предыдущем вызове отработала правильно.

Могу лишь снова предположить, что от сервера ничего не поступало  smile 
Это может быть связано с тем, что Вы не дозалогинились на сервер (одного логина/пароля может быть мало, и сервер ожидает от вас ещё какой-нибудь информации, и пока Вы её не пришлёте, он будет молчать). А, может, в  Winsock.Sending_to_server(); Вы посылаете нечто такое, на что сервер не отвечает... А, может, после первой передачи Sending_to_server у Вас попортился адрес сервера в server_addr, и Вы шлёте не туда (по крайней мере, используйте разные экземпляры этой структуры на приём и на передачу)? Кто знает...


В любом случае стоит подсмотреть сетевой трафик каким-нибудь сниффером (например, Ethereal/WareShark), чтобы убедиться, что ответы от сервера есть (или даже что после регистрации на сервере Вы шлёте UDP по нужному адресу). И уже тогда начинать искать программную ошибку  smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
KPEHDEL
Дата 25.9.2012, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 31.3.2010

Репутация: нет
Всего: нет



Цитата

Не знаю, какому коду верить, но (int *)sizeof(&server_addr) - конструкция-катастрофа.

Естественно, это я просто скопировал не то.

Ошибка была на стороне сервера. Всем спасибо.
PM MAIL WWW ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1458 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.