第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
浙公网安备 33010602011771号