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