Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 17.02.2017
Сообщений: 65

Получить внешний ip, socket,recv( ), win

03.09.2020, 10:10. Показов 1869. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
вопрос очень простой, почему данный код, прекрасно работающий на win7, не работает на win10 (не определяет ip)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
string GetExternalIP( )
{
    string ip;
    // Create socket object
    SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
 
    if( sock == SOCKET_ERROR )  // bad socket?
    {
        return string( );
    }
 
    sockaddr_in sa;
    sa.sin_family = AF_INET;
    sa.sin_port = htons( 80 );  // HTTP service uses port 80
 
    // Time to get the hostname of www.whatismyip.com
    hostent *h = gethostbyname( WHATISMYIP );
 
    if( !h )
        return string( );
 
    memcpy( &sa.sin_addr.s_addr, h->h_addr_list[0], 4 );
 
    if( connect( sock, (sockaddr*)&sa, sizeof( sa ) ) == SOCKET_ERROR )
        return string( );
 
    // This is our packet that we are going to send to the HTTP server.
    char Packet[] =
        "GET /automation/n09230945.asp HTTP/1.1\r\n"    // GET request fetches a page
        "Host: " WHATISMYIP "\r\n"                      // we MUST use this param as of HTTP/1.1
        "Referrer: \r\n"                                // Heh... you should remove this.
        "\r\n";                                         // final \r\n
 
    int rtn = 0;
    int iOptVal = 3;
    int iOptLen = sizeof( int );
    setsockopt( sock, SOL_SOCKET, SO_SNDTIMEO, reinterpret_cast<char*>(&iOptVal), iOptLen );
    rtn = send( sock, Packet, sizeof( Packet ) - 1, 0 );
 
    if( rtn <= 0 )
        return string( );
 
    char Buffer[16384] = { 0 };
    setsockopt( sock, SOL_SOCKET, SO_RCVTIMEO, reinterpret_cast<char*>(&iOptVal), iOptLen );
    rtn = recv( sock, Buffer, sizeof( Buffer ), 0 );
    closesocket( sock );
    // ВОТ ТУТ RECV ВОЗВРАЩАЕТ 0 НА WIN10, но не на win7
    if( rtn <= 0 )
        return string( );
 
    // Did we get a valid reply back from the server?
    if( _strnicmp( Buffer, "HTTP/1.1 200 OK", 15 ) )
        return string( );
 
    char *p = strstr( Buffer, "Cache-control: private" );
 
    if( p == nullptr )
        return string( );
 
    if( strlen( p ) < 26 )
        return string( );
 
    if( p[26] < 0x30 || p[26]>0x39 )
        return string( );
 
    for( int i = 26; p[i] != 0; i++ )
    {
        ip += p[i];
    }
 
    return ip;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.09.2020, 10:10
Ответы с готовыми решениями:

SOCKET: send(), recv()
Начал разбираться с сокетами и в самом начале застрял на элементарном, с функциями send и recv, в програмке в которой сервер отправляет...

recv (socket api)
при первом в хождении в цикл рекв возвращает как положено количество принятых байт,но потом постоянно возвращает 1 почему? int size; ...

Send/recv on listener socket
После переведения сокета в режим прослушивания (bind, listen), возможны ли на нем операции send/recv и к чему они приведут? Из документации...

4
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
03.09.2020, 11:29
lallollulz, вы бы и сами смогли ответить, если бы этот код заботился о диагностике. Проверка ошибок вроде бы делается, но затем "глушится" совершенно одинаковой реакцией на все возможные варианты - возвратом пустой строки. Добавьте тщательную диагностику и сами поймете почему работать перестало.
0
0 / 0 / 0
Регистрация: 17.02.2017
Сообщений: 65
03.09.2020, 13:49  [ТС]
DrOffset, функция возвращает значение второстепенной важности, поэтому все так топорно, перед тем как создалвал тему конечно проверил, в комментариях указал что recv( ) не копирует данные в буфер (данные не приходят), не понимаю почему на win 7 приходят, а на десятке нет
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
03.09.2020, 16:50
Цитата Сообщение от lallollulz Посмотреть сообщение
вопрос очень простой, почему данный код, прекрасно работающий на win7, не работает на win10 (не определяет ip)
Попробуй убрать
Цитата Сообщение от lallollulz Посмотреть сообщение
setsockopt( sock, SOL_SOCKET, SO_RCVTIMEO, reinterpret_cast<char*>(&iOptVal), iOptLen );
Скорее всего маловато ему твоего времени

Добавлено через 2 минуты
И - в SO_RCVTIMEO/SO_SNDTIMEO разве не struct timeval должна передаваться?
0
 Аватар для Annemesski
2673 / 1335 / 480
Регистрация: 08.11.2016
Сообщений: 3,687
03.09.2020, 16:53
lallollulz, что возвращает WSAGetLastError() после setsockopt, send, setsockopt, recv на win10? Вы уверены что таймаутов в 3 миллисекунды достаточно? Не критично, но SO_RCVTIMEO/SO_SNDTIMEO просят DWORD (то бишь unsigned long).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.09.2020, 16:53
Помогаю со студенческими работами здесь

WinApi Socket send(), recv() pool realtime.
Задали задачку: 1. Написати програму-клієнт яка б відправляла довільні дані на сервер, якщо сервер не відповідає на протязі 15 секунд,...

Обработка функции recv структуры SOCKET
Прошу помощи как обработать полученную информацию из функции recv структуры SOCKET. к примеру: char buf=&quot;GooD&quot;;char mass;...

WinAPI Socket, recv, узнать количество байт под буфер
Приветствую, форумчане! Пишу сетевое приложение. Возник вопрос с функцией recv, прием данных из сокета. В ней нужно указывать буфер и...

Assembler linux. Socket recv and socket send invalid arguments
Пишу шеллкод. Он ожидает подключения с 2222 порта, сам подключается на 1111 порт, выделяет память, и должен выполняться пересылка сообщений...

Socket.timeout при повторном recv()
Python 3.5 Windows Есть некая железка на микроконтроллере , работающая по TCP/IP , на ней используется LWIP. Принцип ее работы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru