Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

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

Всем привет! Сильно не пинайте т.к. в первый раз делаю сокетное соединение.
Его я успешно реализовал и данные с сервера подтянул, но последний вызов функции 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, 14:31   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Потому что т.к. данных нет идет ожидание таймаута.
p51x на форуме Ответить с цитированием
Старый 18.09.2018, 14:41   #3
AndreyK
Подтвердите свой е-майл
 
Регистрация: 05.04.2010
Сообщений: 76
По умолчанию

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

Установить его меньше, не? setsockopt с SO_RCVTIMEO
p51x на форуме Ответить с цитированием
Старый 18.09.2018, 14:57   #5
AndreyK
Подтвердите свой е-майл
 
Регистрация: 05.04.2010
Сообщений: 76
По умолчанию

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

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


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Соединение с БД Kef1r Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 0 11.06.2017 18: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