Как получить Ваш собственный (локальный) IP-адрес от udp-сокета (C/C++)

Что может работать, если вы делаете что-то вроде:

int main()
{
    const char* text = "
#include "file.txt"
";
    printf("%s", text);
    return 0;
}

Конечно, вам нужно быть осторожным с тем, что на самом деле находится в файле, убедившись, что нет двойных кавычек, что все соответствующие символы экранированы и т. д.

Поэтому было бы проще, если бы вы просто загрузили текст из файла во время выполнения или встроили текст непосредственно в код.

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

"Something evil\n"\
"this way comes!"

int main()
{
    const char* text =
#include "file.txt"
;
    printf("%s", text);
    return 0;
}
10
задан Community 3 September 2008 в 16:12
поделиться

4 ответа

Вы могли перечислить все сетевые адаптеры, получить их IP-адреса и сравнить часть, покрытую маской подсети с адресом отправителя.

Как:

IPAddress FindLocalIPAddressOfIncomingPacket( senderAddr )
{
    foreach( adapter in EnumAllNetworkAdapters() )
    {
        adapterSubnet = adapter.subnetmask & adapter.ipaddress;
        senderSubnet = adapter.subnetmask & senderAddr;
        if( adapterSubnet == senderSubnet )
        {
            return adapter.ipaddress;
        }
    }
}
3
ответ дан 4 December 2019 в 04:21
поделиться

Решение, предоставленное timbo, предполагает, что диапазоны адресов являются уникальными и не перекрывающимися. В то время как это обычно имеет место, это не универсальное решение.

Существует превосходная реализация функции, которая делает точно, что Вам после предоставляют в книге Steven "Сетевое программирование Unix" (разделите 20.2), Это - функция на основе recvmsg (), а не recvfrom (). Если Вашему сокету включат опцию IP_RECVIF затем recvmsg (), то возвратит индекс интерфейса, в котором был получен пакет. Это может затем использоваться для поиска адреса назначения.

Исходный код доступен здесь. Рассматриваемая функция 'recvfrom_flags ()'

3
ответ дан 4 December 2019 в 04:21
поделиться
ssize_t
     recvfrom(int socket, void *restrict buffer, size_t length, int flags,
         struct sockaddr *restrict address, socklen_t *restrict address_len);

     ssize_t
     recvmsg(int socket, struct msghdr *message, int flags);

[..]
     If address is not a null pointer and the socket is not connection-oriented, the
     source address of the message is filled in.

Фактический код:

int nbytes = recvfrom(sock, buf, MAXBUFSIZE, MSG_WAITALL, (struct sockaddr *)&bindaddr, &addrlen);

fprintf (stdout, "Чтение %d байты на локальном адресе %s\n", nbytes, inet_ntoa (bindaddr.sin_addr.s_addr));

надеюсь, это поможет.

-3
ответ дан 4 December 2019 в 04:21
поделиться

Хороший день,

Я предполагаю, что Вы сделали Ваш обязывать использование INADDR_ANY указывать адрес.

Если это верно, затем семантика INADDR_ANY такова, что сокет UDP создается на порте, указанном во всех Ваших интерфейсах. Сокет собирается получить все пакеты, отправленные во все интерфейсы на указанном порте.

При отправке использующий этот сокет, используется самый низкий пронумерованный интерфейс. Поле адреса исходящего отправителя установлено на IP-адрес того первого используемого исходящего интерфейса.

Первый исходящий интерфейс определяется как последовательность, когда Вы делаете ifconfig-a. Это, вероятно, будет eth0.

HTH.

аплодисменты, Rob

3
ответ дан 4 December 2019 в 04:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: