一、概述
IP Utils,也稱為inetutils,是一個常用於網路操作的工具包,包含了多個工具,例如ping、traceroute、telnet、ftp等等。它也是Linux、Unix操作系統中的標準網路工具包之一。在本文中,我們將會對IP Utils提供的一些工具和API進行詳細的介紹。
二、ping工具
ping命令是極為常見的網路工具之一,用來測試本地計算機與目標計算機之間的網路連接質量。在IP Utils中,我們可以使用以下代碼段來實現對遠程主機的ping操作:
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>
int main(int argc, char *argv[])
{
char *destip;
struct hostent *host;
struct sockaddr_in dest_addr;
int sockfd, recv_bytes, optval;
socklen_t optlen = sizeof(optval);
if(argc != 2)
{
printf("Usage: %s <ipaddress>\n", argv[0]);
return 0;
}
destip = argv[1];
sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &optval, optlen);
bzero(&dest_addr, sizeof(dest_addr));
dest_addr.sin_family = AF_INET;
dest_addr.sin_addr.s_addr = inet_addr(destip);
if((host = gethostbyname(destip)) != NULL)
{
bcopy(host->h_addr, &dest_addr.sin_addr, host->h_length);
}
printf("Ping %s...\n", argv[1]);
while(1)
{
if(sendto(sockfd, NULL, 0, 0, (struct sockaddr *)&dest_addr, sizeof(dest_addr)) < 0)
{
perror("sendto");
break;
}
recv_bytes = recv(sockfd, NULL, 0, 0);
if(recv_bytes > 0)
{
printf("%d bytes from %s: icmp_seq=1 ttl=%d\n", recv_bytes, destip, dest_addr.sin_family);
}
sleep(1);
}
close(sockfd);
return 0;
}
在上面的代碼段中,我們使用了socket()函數來創建新的原始套接字。在setsockopt()函數中,我們開啟了SO_REUSEADDR選項,這將允許我們在關閉後重新使用原始套接字。我們也使用了gethostbyname()函數,這將返回與遠程主機對應的hostent結構體,其中包含了主機的IP地址。
三、traceroute工具
traceroute命令可以用來跟蹤數據包在網路中傳輸的路徑。在IP Utils中,我們可以使用以下代碼段來實現traceroute操作:
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/time.h>
#include <sys/socket.h>
#define MAX_HOPS 64
int main(int argc, char *argv[])
{
int ttl = 1;
int sockfd, recv_bytes;
char *destip;
struct sockaddr_in dest_addr;
char recv_buff[512];
struct timeval tv;
if(argc != 2)
{
printf("Usage: %s <ipaddress>\n", argv[0]);
return 0;
}
destip = argv[1];
bzero(&dest_addr, sizeof(dest_addr));
dest_addr.sin_family = AF_INET;
dest_addr.sin_addr.s_addr = inet_addr(destip);
sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
setsockopt(sockfd, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl));
printf("Traceroute to %s (%s), %d hops max\n", destip, inet_ntoa(dest_addr.sin_addr), MAX_HOPS);
while(ttl <= MAX_HOPS)
{
setsockopt(sockfd, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl));
tv.tv_sec = 1;
tv.tv_usec = 0;
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO,&tv, sizeof(tv));
struct sockaddr_in src_addr;
socklen_t addrlen = sizeof(src_addr);
bzero(&src_addr, sizeof(src_addr));
printf("%d\t", ttl);
for(int i = 1; i <= 3; ++i)
{
gettimeofday(&tv, NULL);
double t1 = tv.tv_sec * 1000 + (double)tv.tv_usec / 1000;
if(sendto(sockfd, NULL, 0, 0, (struct sockaddr*)&dest_addr, sizeof(dest_addr)) < 0)
{
printf("\t*\t");
continue;
}
if((recv_bytes = recvfrom(sockfd, recv_buff, sizeof(recv_buff), 0, (struct sockaddr*)&src_addr, &addrlen)) < 0)
{
printf("\t*\t");
continue;
}
gettimeofday(&tv, NULL);
double t2 = tv.tv_sec * 1000 + (double)tv.tv_usec / 1000;
double rtt = t2 - t1;
printf("%.2fms\t", rtt);
}
printf("\n");
++ttl;
if(src_addr.sin_addr.s_addr == dest_addr.sin_addr.s_addr)
{
printf("%s\t", inet_ntoa(src_addr.sin_addr));
break;
}
}
close(sockfd);
return 0;
}
在上面的代碼段中,我們使用了SO_RCVTIMEO選項來在接收數據時設置超時時間。通過使用sendto()和recvfrom()函數,我們可以從套接字中接收和發送數據包。在traceroute中,我們不斷地增加TTL,然後對目標計算機進行ping操作,以查找數據包傳輸的路徑。如果路徑中出現了與目標計算機的IP地址相同的主機,則可確定數據包已經到達目的地。
四、telnet工具
telnet命令是一種常用的用來遠程連接計算機的工具。在IP Utils中,我們可以使用以下代碼來實現telnet操作:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#define MAXLINE 4096
int main(int argc, char **argv)
{
int sockfd, n;
char recvline[MAXLINE + 1];
struct sockaddr_in servaddr;
if(argc != 3)
{
printf("usage: %s <ipaddress> <portnumber>\n", argv[0]);
return 0;
}
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
perror("socket");
return 0;
}
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(atoi(argv[2]));
if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
{
printf("inet_pton error for %s\n", argv[1]);
return 0;
}
if(connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)
{
perror("connect");
return 0;
}
while((n = read(sockfd, recvline, MAXLINE)) > 0)
{
recvline[n] = 0;
if(fputs(recvline, stdout) == EOF)
{
perror("fputs");
return 0;
}
}
if(n < 0)
{
perror("read");
return 0;
}
return 0;
}
在上面的代碼段中,我們使用了socket()函數來創建一個新的套接字,並使用connect()函數來將套接字連接到目標計算機。接著,我們可以使用read()函數來接收數據,並使用fputs()函數來將數據輸出到控制台上。
五、結論
本文介紹了IP Utils網路工具包,並詳細介紹了其中的幾個常用工具,包括ping、traceroute、telnet等。通過使用這些工具,我們可以更好地了解網路和計算機之間的通信方式,並對網路連接進行更精確的測試和調試。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/160064.html
微信掃一掃
支付寶掃一掃