请帮我生成一个http ping进行链路检测的C语言代码
时间: 2023-12-06 11:44:31 浏览: 81
以下是一个简单的使用 sockets 库实现的 HTTP ping C 语言代码,可以用来进行链路检测:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
#include <time.h>
#define PORT 80
#define BUFSIZE 1024
#define TIMEOUT 3
int http_ping(const char *url) {
struct sockaddr_in server_addr;
struct hostent *host;
int sockfd, nbytes, rv, response = -1;
char buf[BUFSIZE];
char *request;
time_t start_time, end_time;
double elapsed_time;
// 解析 URL
if ((host = gethostbyname(url)) == NULL) {
perror("gethostbyname");
return -1;
}
// 创建 socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("socket");
return -1;
}
// 设置服务器地址
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
memcpy(&server_addr.sin_addr.s_addr, host->h_addr_list[0], host->h_length);
// 连接服务器
rv = connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
if (rv < 0) {
perror("connect");
return -1;
}
// 构造 HTTP 请求
request = malloc(strlen(url) + 20);
sprintf(request, "HEAD / HTTP/1.1\r\nHost: %s\r\n\r\n", url);
// 发送 HTTP 请求
nbytes = send(sockfd, request, strlen(request), 0);
if (nbytes < 0) {
perror("send");
return -1;
}
// 开始计时
start_time = time(NULL);
// 接收 HTTP 响应
while ((nbytes = recv(sockfd, buf, BUFSIZE - 1, 0)) > 0) {
buf[nbytes] = '\0';
if (strstr(buf, "HTTP/") != NULL) {
if (strstr(buf, "200 OK") != NULL) {
response = 0;
} else {
response = -1;
}
break;
}
}
// 结束计时
end_time = time(NULL);
elapsed_time = difftime(end_time, start_time);
// 输出结果
if (response == 0) {
printf("HTTP ping %s succeeded in %.2lf seconds.\n", url, elapsed_time);
} else {
printf("HTTP ping %s failed.\n", url);
}
// 关闭 socket
close(sockfd);
return response;
}
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage: %s <url>\n", argv[0]);
return 1;
}
http_ping(argv[1]);
return 0;
}
```
这个程序会向指定的 URL 发送一个 HTTP HEAD 请求,并等待服务器响应。如果收到 HTTP 200 OK 响应,则表示链路通畅;否则就表示链路不通。程序会输出相应的结果,包括响应时间。
阅读全文