Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 18.09.2018, 15:22   #1
AndreyK
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 72
Репутация: 10
По умолчанию Сокетное соединение

Всем привет! Сильно не пинайте т.к. в первый раз делаю сокетное соединение.
Его я успешно реализовал и данные с сервера подтянул, но последний вызов функции recv почему-то отрабатывает очень долго и я не могу понять почему. Может вы подскажете. Код ниже:

Код:

WSDATA wsaData;
if (WSAStartup(MAKEWORD(2,0), &wsaData)){
        wcout << L"Сокет не загружен" << endl;
        return 1;
}

struct sockaddr_in = {
        addr.sin_family = AF_INET,
        addr.sin_port = htons(80)
}

addr.sin_addr.S_un.S_addr = inet_addr("192.158.8.2");

SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == SOCKET_ERROR){
        WSACleanup();
        wcout << L"Ошибка создания сокета" << endl;
        return 1;
}

if (SOCKET_ERROR == connect(sock, (struct sockaddr *)&addr, sizeof(addr))){
        closesocket(sock);	
        WSACleanup();
        wcout << L"Ошибка сокетного соединения" << endl;
        return 1;
}

wstring header(L"GET / HTTP/1.1\r\n");
header.append(L"Host: 192.158.8.2\r\n\r\n");

if (SOCKET_ERROR == send(sock, header.c_str(), header.size(), 0)){
        closesocket(sock);	
        WSACleanup();
        cout << "Ошибка отправки запроса на сервер" << endl;
        return 1;
}

wstring ansser;
int len = 0;
char buf[65535];
do {
        len = recv(sock, buf, sizeof(buf), 0); // Последний вызов длится порядка 10-15 секунд
        if (len > 0){
                size_t outSize;
                wchar_t wbuf[sizeof(buf)];
                mbstowcs_s(&outSize, wbuf, len, buf, len - 1);
                ansser.append(wbuf);
        } else if(len == 0){
                break;
        } else {
                cout << "Ошибка получения данных с сервера";
        }
 } while (len > 0);

 closesocket(sock);	
 WSACleanup();

 wcout << answer << endl;

AndreyK вне форума   Ответить с цитированием
Старый 18.09.2018, 15:31   #2
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 12,455
Репутация: 2073

icq: 216409213
По умолчанию

Потому что т.к. данных нет идет ожидание таймаута.
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x вне форума   Ответить с цитированием
Старый 18.09.2018, 15:41   #3
AndreyK
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 72
Репутация: 10
По умолчанию

Благодарю за ответ. Тоже предполагал, что в может быть проблема в таймаут соединении. Но вот как сделать так, чтобы он быстро выходил если нет данных.
AndreyK вне форума   Ответить с цитированием
Старый 18.09.2018, 15:44   #4
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 12,455
Репутация: 2073

icq: 216409213
По умолчанию

Установить его меньше, не? setsockopt с SO_RCVTIMEO
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x вне форума   Ответить с цитированием
Старый 18.09.2018, 15:57   #5
AndreyK
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 72
Репутация: 10
По умолчанию

Согласен, можно и через setsockopt. Но я ещё устанавливал timeout через функцию select. Но вот какой таймаут устанавилвать? 1 сек или 0.5 сек? А что если я установлю таймаут в 0.5 сек и когда например recv не успеет забрать данные за 0.5 сек, то я получается не все данные заберу. Или за 0,5 секунды он по-любому должен забрать данные?
AndreyK вне форума   Ответить с цитированием
Старый 18.09.2018, 17:55   #6
AndreyK
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 72
Репутация: 10
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Установить его меньше, не? setsockopt с SO_RCVTIMEO
Благодарю Вас за ответ.
AndreyK вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Соединение с БД Kef1r Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 0 11.06.2017 19:46
Базовое соединение закрыто: Соединение было неожиданно закрыто. drz72050 C# (си шарп) 0 11.04.2014 16:04
Соединение с БД Наталья Баева PHP 2 08.04.2014 09:52
Соединение с БД Yurafpi Помощь студентам 0 04.05.2010 18:24
Соединение с БД Angel_666 БД в Delphi 9 04.05.2007 16:10


05:35.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru