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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по UDP чату. 
:(
    Опции темы
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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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