簡體   English   中英

錯誤 C4996:“gethostbyaddr”:改用 getnameinfo() 或 GetNameInfoW() 或定義 _WINSOCK_DEPRECATED_NO_WARNINGS 以禁用不推薦使用的 API 警告

[英]error C4996: 'gethostbyaddr': Use getnameinfo() or GetNameInfoW() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings

我編寫客戶端 - 服務器應用程序。 找到這個模板,但是當我運行它時,出現了一些錯誤:

error C4996: 'gethostbyaddr': Use getnameinfo() or GetNameInfoW() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings
error C4996: 'inet_ntoa': Use inet_ntop() or InetNtop() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings

嘗試通過 getnameinfo() 和 GetNameInfoW() 更改函數 gethostbyaddr,但得到未定義的錯誤。 如果我定義了 _WINSOCK_DEPRECATED_NO_WARNINGS,則會收到錯誤 LNK2019:對未解析的外部字符的引用。 如何解決這些問題?

#include <stdio.h>
#include <winsock2.h>
#define PORT 666    // порт сервера
#define sHELLO "Hello, %s [%s] Sailor\n"

int main(int argc, char* argv[])
{
char buff[1024];

printf("UDP DEMO echo-Server\n");

// шаг 1 - подключение библиотеки 
if (WSAStartup(0x202, (WSADATA*)&buff[0]))
{
    printf("WSAStartup error: %d\n",
        WSAGetLastError());
    return -1;
}

// шаг 2 - создание сокета
SOCKET my_sock;
my_sock = socket(AF_INET, SOCK_DGRAM, 0);
if (my_sock == INVALID_SOCKET)
{
    printf("Socket() error: %d\n", WSAGetLastError());
    WSACleanup();
    return -1;
}

// шаг 3 - связывание сокета с локальным адресом 
sockaddr_in local_addr;
local_addr.sin_family = AF_INET;
local_addr.sin_addr.s_addr = INADDR_ANY;
local_addr.sin_port = htons(PORT);

if (bind(my_sock, (sockaddr*)&local_addr,
    sizeof(local_addr)))
{
    printf("bind error: %d\n", WSAGetLastError());
    closesocket(my_sock);
    WSACleanup();
    return -1;
}

// шаг 4 обработка пакетов, присланных клиентами
while (1)
{
    sockaddr_in client_addr;
    int client_addr_size = sizeof(client_addr);
    int bsize = recvfrom(my_sock, &buff[0],
        sizeof(buff) - 1, 0,
        (sockaddr*)&client_addr, &client_addr_size);
    if (bsize == SOCKET_ERROR)
        printf("recvfrom() error: %d\n",
            WSAGetLastError());

    // Определяем IP-адрес клиента и прочие атрибуты
    HOSTENT* hst;
    hst = gethostbyaddr((char*)
        &client_addr.sin_addr, 4, AF_INET);
    printf("+%s [%s:%d] new DATAGRAM!\n",
        (hst) ? hst->h_name : "Unknown host",
        inet_ntoa(client_addr.sin_addr),
        ntohs(client_addr.sin_port));

    // добавление завершающего нуля
    buff[bsize-1] = 0;

    // Вывод на экран 
    printf("C=>S:%s\n", &buff[0]);

    // посылка датаграммы клиенту
    sendto(my_sock, &buff[0], bsize, 0,
        (sockaddr*)&client_addr, sizeof(client_addr));
}
return 0;
}

您需要定義_WINSOCK_DEPRECATED_NO_WARNINGS前加入winsock2標題和鏈接與Ws2_32.lib庫。 如下所示或將它們添加到項目設置中。

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#pragma comment(lib, "Ws2_32.lib")

#include <winsock2.h>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM