|
|

楼主 |
发表于 2005-4-27 15:08:45
|
显示全部楼层
谢谢Tetris!我在你说的哪个文件里看到了“默认网关”的地址。但我不知道这个文件是否是实时更新的呢?比如说我通过命令修改了默认网关,那儿的地址会变吗?
我更想通过访问内核数据结构的方法得到这些值,不知道怎么做。
下面给出我得到IP等的程序,希望哪位能告诉我剩下的该怎么做?
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <net/if.h>
#include <net/if_arp.h>
#include <arpa/inet.h>
#include <errno.h>
#include <unistd.h>
#include <net/route.h>
#define ETH_NAME "eth0"
#define MAXHOSTNAMELEN 100
int main()
{
printf("Content-Type:text/plain\n\n");
printf("<TITLE>主机IP</TITLE>");
printf("<H3>主机网络状况查询结果:</H3>");
int sock;
struct sockaddr_in sin;
struct ifreq ifr;
struct hostent *host;
char **alias;
char hostname[MAXHOSTNAMELEN]; /* hostname */
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock == -1)
{
perror("socket");
return -1;
}
strncpy(ifr.ifr_name, ETH_NAME, IFNAMSIZ);
ifr.ifr_name[IFNAMSIZ - 1] = 0;
/////////////////////////////////////////////// get IP
if (ioctl(sock, SIOCGIFADDR, &ifr) < 0)
{
perror("ioctl");
return -1;
}
memcpy(&sin, &ifr.ifr_addr, sizeof(sin));
printf("your IP address is:%s<br>\n", inet_ntoa(sin.sin_addr));
///////////////////////////////////////////////// get netmask
if (ioctl(sock, SIOCGIFNETMASK, &ifr) < 0)
{
perror("ioctl");
return -1;
}
memcpy(&sin, &ifr.ifr_addr, sizeof(sin));
printf("your netmask is:%s<br>\n", inet_ntoa(sin.sin_addr));
///////////////////////////////////////////////// get broadcast address
if (ioctl(sock, SIOCGIFBRDADDR, &ifr) < 0)
{
perror("ioctl");
return -1;
}
memcpy(&sin, &ifr.ifr_addr, sizeof(sin));
printf("your broadcast address is:%s<br>\n", inet_ntoa(sin.sin_addr));
///////////////////////////////////////////////// get hostname
gethostname(hostname,MAXHOSTNAMELEN );
printf("your hostname is:%s<BR>",hostname);
////////////////////////////////////////////////
return 0;
} |
|