1

一个小问题:如何在 C 程序中使用 Linux 套接字来检查 Internet 连接?听说这个是最简单最合适的方法(比如不调用程序ping),就是不知道怎么做。

4

2 回答 2

2

随心所欲地改变它。:)

void *parser_online(void *garbage)
{
    int sockfd,val;
    char buffer[MAX_LINE];
    struct hostent *google_ent=NULL;
    struct sockaddr_in google_addr;

    sockfd = -1;

    if((google_ent = gethostbyname("www.google.com")) != NULL)
    {
        if((sockfd =    socket(google_ent->h_addrtype,SOCK_STREAM,IPPROTO_TCP)) != -1)
        {
            val = 1;
            if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR, (char *) &val, sizeof(val)) == 0 && setsockopt(sockfd,IPPROTO_TCP,TCP_NODELAY, (char *) &val, sizeof(val)) == 0)
            {
                google_addr.sin_family = google_ent->h_addrtype;
                memcpy(&(google_addr.sin_addr), google_ent->h_addr, google_ent->h_length);
                google_addr.sin_port = htons(80);
                if( connect(sockfd,(struct sockaddr *) &google_addr,sizeof(google_addr)) == 0)
                {
                    if(write(sockfd,"GET /index.html HTTP/1.1\r\n\r\n", 29) >= 28)
                    {
                        shutdown(sockfd, SHUT_WR);
                        if(read(sockfd, buffer, MAX_LINE) != -1) // all right!
                        {
                            close(sockfd);
                            return (void *) 1;
                        }
                        else
                            report_error("read()",1,0,verbose);
                    }
                    else
                        report_error("write()",1,0,verbose);
                }
                else
                    report_error("connect()",1,0,verbose);
            }
            else
                report_error("setsockopt()",1,0,verbose);
        }
        else
            report_error("socket()",1,0,verbose);
    }
    else
        report_error("cannot resolve IP for mom Google.",0,0,error); // this is is the most common error.

    if(sockfd!=-1)
        close(sockfd);
    return (void *) 0; // no internet

}
于 2012-05-13T10:37:11.810 回答
0

尝试在众所周知的开放端口(例如 80)上连接到知名主机(例如 google.com)。如果失败,则很有可能互联网已关闭。这是一个可以帮助您入门的套接字教程:http ://www.linuxhowtos.org/C_C++/socket.htm 。

于 2012-05-10T19:43:46.480 回答