2015-04-25 7 views
0

Я пытаюсь написать программу на C/C++, чтобы проверить подключение к Интернету на компьютере с Windows. Любая помощь приветствуется. Спасибо.Каков самый быстрый способ проверить подключение к Интернету с помощью C или C++?

+2

Самый быстрый в каком смысле? Развивать? Число циклов процессора? Требуется объем сетевого трафика? – TZHX

+0

Я пытаюсь заставить его работать на машине Windows с помощью Visual Studio. Самый быстрый, я имею в виду лучший и самый эффективный способ в смысле программиста. Легко программируется и работает. – perhaps

+0

Вилка пинга и захват результата. – TZHX

ответ

3

Я могу только показать вам короткий путь, основанный на примере Microsoft. Фактически, единственный способ убедиться, что вы можете подключиться к Интернету, - это попытаться подключиться к серверу в Интернете. Большинство приложений используют Google в качестве целевого сервера или собственного сервера (если они есть). Я изменил пример для подключения к Google на порт 80. Если программа возврата 0, это был успех, в противном случае она возвращает 1. Это должно дать вам кузницы кадров для собственного решения:

// example from: 
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms737591(v=vs.85).aspx 
#define WIN32_LEAN_AND_MEAN 

#include <windows.h> 
#include <winsock2.h> 
#include <ws2tcpip.h> 
#include <stdlib.h> 
#include <stdio.h> 


// Need to link with Ws2_32.lib, Mswsock.lib, and Advapi32.lib 
#pragma comment (lib, "Ws2_32.lib") 
#pragma comment (lib, "Mswsock.lib") 
#pragma comment (lib, "AdvApi32.lib") 


#define DEFAULT_BUFLEN 512 
#define DEFAULT_PORT "80" 

int __cdecl main(int argc, char **) 
{ 
    WSADATA wsaData; 
    SOCKET ConnectSocket = INVALID_SOCKET; 
    struct addrinfo *result = NULL, 
     *ptr = NULL, 
     hints; 
    char *sendbuf = "this is a test"; 
    char recvbuf[DEFAULT_BUFLEN]; 
    int iResult; 
    int recvbuflen = DEFAULT_BUFLEN; 


    // Initialize Winsock 
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); 
    if (iResult != 0) { 
     printf("WSAStartup failed with error: %d\n", iResult); 
     return 1; 
    } 

    ZeroMemory(&hints, sizeof(hints)); 
    hints.ai_family = AF_UNSPEC; 
    hints.ai_socktype = SOCK_STREAM; 
    hints.ai_protocol = IPPROTO_TCP; 

    // Resolve the server address and port 
    iResult = getaddrinfo("www.google.com", DEFAULT_PORT, &hints, &result); 
    if (iResult != 0) { 
     printf("getaddrinfo failed with error: %d\n", iResult); 
     WSACleanup(); 
     return 1; 
    } 

    // Attempt to connect to an address until one succeeds 
    for (ptr = result; ptr != NULL; ptr = ptr->ai_next) { 

     // Create a SOCKET for connecting to server 
     ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, 
      ptr->ai_protocol); 
     if (ConnectSocket == INVALID_SOCKET) { 
      printf("socket failed with error: %ld\n", WSAGetLastError()); 
      WSACleanup(); 
      return 1; 
     } 

     // Connect to server. 
     iResult = connect(ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen); 
     if (iResult == SOCKET_ERROR) { 
      closesocket(ConnectSocket); 
      ConnectSocket = INVALID_SOCKET; 
      continue; 
     } 
     break; 
    } 

    freeaddrinfo(result); 

    if (ConnectSocket == INVALID_SOCKET) { 
     printf("Unable to connect to server!\n"); 
     WSACleanup(); 
     return 1; 
    } 

    // Send an initial buffer 
    iResult = send(ConnectSocket, sendbuf, (int)strlen(sendbuf), 0); 
    if (iResult == SOCKET_ERROR) { 
     printf("send failed with error: %d\n", WSAGetLastError()); 
     closesocket(ConnectSocket); 
     WSACleanup(); 
     return 1; 
    } 

    printf("Bytes Sent: %ld\n", iResult); 

    // shutdown the connection since no more data will be sent 
    iResult = shutdown(ConnectSocket, SD_SEND); 
    if (iResult == SOCKET_ERROR) { 
     printf("shutdown failed with error: %d\n", WSAGetLastError()); 
     closesocket(ConnectSocket); 
     WSACleanup(); 
     return 1; 
    } 

    // Receive until the peer closes the connection 
/* do { 

     iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0); 
     if (iResult > 0) 
      printf("Bytes received: %d\n", iResult); 
     else if (iResult == 0) 
      printf("Connection closed\n"); 
     else 
      printf("recv failed with error: %d\n", WSAGetLastError()); 

    } while(iResult > 0); 
*/ 
    // cleanup 
    closesocket(ConnectSocket); 
    WSACleanup(); 

    return 0; 
} 

, если вы измените буфер от «это тест» к действительному запросу HTTP, вы даже можете получить ответ, который вы можете прочитать (я прокомментирую эту часть). Это не обязательно, поскольку соединение с TCP/IP уже говорит о том, что соединение возможно. Конечно, есть UDP-пинговые пути, но у них (по-моему) нет преимущества. Разрешение имен можно отбросить, и вы можете напрямую использовать ip. Разрешение имен не является признаком работы Интернета, поскольку у большинства провайдеров есть внутренний DNS-сервер, который может быть даже в случае невозможности подключения к Интернету.

 Смежные вопросы

  • Нет связанных вопросов^_^