第3章 文件操作(1 底层访问)

  • 读写与打开
 1 #include <unistd.h>
 2 
 3 ssize_t write(int fd, const void *buf, size_t count);
 4 ssize_t read(int fd, void *buf, size_t count);
 5 
 6 
 7 #include <sys/types.h>
 8 #include <sys/stat.h>
 9 #include <fcntl.h>
10 
11 int open(const char *pathname, int flags);
12 int open(const char *pathname, int flags, mode_t mode);
  • ioctl的使用
#include <sys/ioctl.h>

int ioctl(int d, int request, ...);

 

以下表格取自百度百科http://baike.baidu.com/view/1081282.htm

类别 Request 说明 数据类型
 
 
SIOCATMARK 
SIOCSPGRP 
SIOCGPGRP
是否位于带外标记 
设置套接口的进程ID 或进程组ID 
获取套接口的进程ID 或进程组ID
int 
int 
int
 
FIONBIO 
FIOASYNC 
FIONREAD 
FIOSETOWN 
FIOGETOWN
设置/ 清除非阻塞I/O 标志 
设置/ 清除信号驱动异步I/O 标志 
获取接收缓存区中的字节数 
设置文件的进程ID 或进程组ID 
获取文件的进程ID 或进程组ID
int 
int 
int 
int 
int
 
SIOCGIFCONF 
SIOCSIFADDR 
SIOCGIFADDR 
SIOCSIFFLAGS 
SIOCGIFFLAGS 
SIOCSIFDSTADDR 
SIOCGIFDSTADDR 
SIOCGIFBRDADDR 
SIOCSIFBRDADDR 
SIOCGIFNETMASK 
SIOCSIFNETMASK 
SIOCGIFMETRIC 
SIOCSIFMETRIC 
SIOCGIFMTU 
SIOCxxx
获取所有接口的清单 
设置接口地址 
获取接口地址 
设置接口标志 
获取接口标志 
设置点到点地址 
获取点到点地址 
获取广播地址 
设置广播地址 
获取子网掩码 
设置子网掩码 
获取接口的测度 
设置接口的测度 
获取接口MTU 
(还有很多取决于系统的实现)
struct ifconf 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq
ARP SIOCSARP 
SIOCGARP 
SIOCDARP
创建/ 修改ARP 表项 
获取ARP 表项 
删除ARP 表项
struct arpreq 
struct arpreq 
struct arpreq
 
SIOCADDRT 
SIOCDELRT
增加路径 
删除路径
struct rtentry 
struct rtentry
I_xxx  

正好网上http://www.cppblog.com/bobocpp/archive/2009/02/21/74475.aspx有例子

程序1:检测接口的 inet_addr,netmask,broad_addr

***************************程序1****************************************
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#include <sys/ioctl.h>
#include <net/if.h>

static void usage(){
        printf("usage : ipconfig interface \n");
        exit(0);
}

int main(int argc,char **argv)
{
        struct sockaddr_in *addr;
        struct ifreq ifr;
        char *name,*address;
        int sockfd;

        if(argc != 2)
                usage();
        else
                name = argv[1];

        sockfd = socket(AF_INET,SOCK_DGRAM,0);
        strncpy(ifr.ifr_name,name,IFNAMSIZ-1);

        if(ioctl(sockfd,SIOCGIFADDR,&ifr) == -1)
                perror("ioctl error"),exit(1);
        addr = (struct sockaddr_in *)&(ifr.ifr_addr);
        address = inet_ntoa(addr->sin_addr);
        printf("inet addr: %s ",address);

        if(ioctl(sockfd,SIOCGIFBRDADDR,&ifr) == -1)
                perror("ioctl error"),exit(1);
        addr = (struct sockaddr_in *)&ifr.ifr_broadaddr;
        address = inet_ntoa(addr->sin_addr);
        printf("broad addr: %s ",address);

        if(ioctl(sockfd,SIOCGIFNETMASK,&ifr) == -1)
                perror("ioctl error"),exit(1);
        addr = (struct sockaddr_in *)&ifr.ifr_addr;
        address = inet_ntoa(addr->sin_addr);
        printf("inet mask: %s ",address);

        printf("\n");
        exit(0);
}

 

关于ifreq


#include <net/if.h>
struct ifreq
  {
# define IFHWADDRLEN    6
# define IFNAMSIZ    IF_NAMESIZE
    union
      {
    char ifrn_name[IFNAMSIZ];    /* Interface name, e.g. "en0".  */
      } ifr_ifrn;

    union
      {
    struct sockaddr ifru_addr;
    struct sockaddr ifru_dstaddr;
    struct sockaddr ifru_broadaddr;
    struct sockaddr ifru_netmask;
    struct sockaddr ifru_hwaddr;
    short int ifru_flags;
    int ifru_ivalue;
    int ifru_mtu;
    struct ifmap ifru_map;
    char ifru_slave[IFNAMSIZ];    /* Just fits the size */
    char ifru_newname[IFNAMSIZ];
    __caddr_t ifru_data;
      } ifr_ifru;
  };

 

结果

./ioctl_test lo
inet addr: 127.0.0.1 broad addr: 0.0.0.0 inet mask: 255.0.0.0 


./ioctl_test wlan0
inet addr: 192.168.1.102 broad addr: 192.168.1.255 inet mask: 255.255.255.0

 

同样获取mac地址可以参考

http://www.cnblogs.com/kimiz/archive/2012/07/08/2581227.html

 

posted @ 2012-07-17 20:48  kimiz  阅读(135)  评论(0)    收藏  举报