分类: LINUX
2010-09-28 17:39:37
30.socketpair函数
#include
int socketpair(int family, int type, int protocol, int sockfd[2]);
返回:成功返回0,出错返回-1。
family必须为AF_LOCAL,protocol必须为0,type可以是SOCK_STREAM或SOCK_DGRAM。新创建的两个套接口描述字作为sockfd[0]和sockfd[1]返回。
这两个描述字相互连接,没有名字,即没有涉及隐式bind。
以SOCK_STREAM作为type调用所得到的结果称为流管道(stream pipe)。这与一般的UNIX管道类似,但流管道是全双工的,两个描述字都是可读写的。
31.套接口ioctl函数
#include
int ioctl(int fd, int request, … /* void *arg */ );
返回:成功返回0,出错返回-1。
第三个参数总是一个指针,但指针的类型依赖于request。
ioctl和网络有关的请求可分为如下6类:
类别 |
request |
描述 |
数据类型 |
|
|
|
|
套接口 |
SIOCATMARK |
在带外标志上吗 |
int |
|
SIOCSPGRP |
设置套接口的进程ID或进程组ID |
int |
|
SIOCGPGRP |
获取套接口的进程ID或进程组ID |
int |
|
|
|
|
文件 |
FIONBIO |
设置/清除非阻塞标志 |
int |
|
FIOASYNC |
设置/清除异步I/O标志 |
int |
|
FIONREAD |
获取接收缓冲区中的字节数 |
int |
|
FIOSETOWN |
设置文件的进程ID或进程组ID |
int |
|
FIOGETOWN |
获取文件的进程ID或进程组ID |
int |
|
|
|
|
接口 |
SIOCGIFCONF |
获取所有接口的列表 |
struct ifconf |
|
SIOCSIFADDR |
设置接口地址 |
struct ifreq |
|
SIOCGIFADDR |
获取接口地址 |
struct ifreq |
|
SIOCSIFFLAGS |
设置接口标志 |
struct ifreq |
|
SIOCGIFFLAGS |
获取接口标志 |
struct ifreq |
|
SIOCSIFDSTADDR |
设置点到点地址 |
struct ifreq |
|
SIOCGIFDSTADDR |
获取点到点地址 |
struct ifreq |
|
SIOCGIFBRDADDR |
获取广播地址 |
struct ifreq |
|
SIOCSIFBRDADDR |
设置广播地址 |
struct ifreq |
|
SIOCGIFNETMASK |
获取子网掩码 |
struct ifreq |
|
SIOCSIFNETMASK |
设置子网掩码 |
struct ifreq |
|
SIOCGIFMETRIC |
获取接口的测度(metric) |
struct ifreq |
|
SIOCSIFMETRIC |
设置接口的测度(metric) |
struct ifreq |
|
SIOCxxx |
(有很多,依赖于实现) |
|
|
|
|
|
ARP |
SIOCSARP |
创建/修改ARP项 |
struct arpreq |
|
SIOCGARP |
获取ARP项 |
struct arpreq |
|
SIOCDARP |
删除ARP项 |
struct arpreq |
|
|
|
|
路由 |
SIOCADDRT |
增加路径 |
struct rtentry |
|
SIOCDELRT |
删除路径 |
struct rtentry |
|
|
|
|
流 |
I_xxx |
|
|
(1)套接口操作
· SIOCATMARK:如果套接口的读指针当前在带外标志上,则通过第三个参数指向的整数返回一个非零值,否则返回零。Posix.1g用sockatmark代替了这种请求。
· SIOCGPGRP:通过第三个参数指向的整数返回为接收来自这个套接口的SIGIO或SIGURG信号而设置的进程ID或进程组ID。这和fcntl的F_GETOWN相同。
· SIOCSPGRP:用第三个参数指向的整数设置进程ID或进程组ID以接收这个套接口的SIGIO或SIGURG信号。这和fcntl的F_SETOWN相同。
(2)文件操作
· FIONBIO:套接口的非阻塞标志会根据第三个参数指向的值是否为零而清除或设置。等价于fcntl的F_SETFL设置/清除O_NONBLOCK标志。
· FIOASYNC:根据第三个参数指向的值是否为零决定清除或接收套接口上的异步I/O信号。等价于fcntl的F_SETFL设置和清除O_AYNC标志。
· FIONREAD:在第三个参数指向的整数中返回套接口接收缓冲区中当前的字节数。
· FIOSETOWN:在套接口上等价于SIOCSPGRP。
· FIOGETOWN:在套接口上等价于SIOCGPGRP。
(3)接口配置
SIOCGIFCONF:从内核中获取系统中配置的所有接口。它使用了结构ifconf,ifconf又使用了ifreq结构。
结构定义如下:
struct ifconf {
int ifc_len; /* size of buffer, value-result */
union {
caddr_t ifcu_buf; /* input from user->kernel */
struct ifreq *ifcu_req; /* return from kernel->user */
}ifc_ifcu;
};
#define ifc_buf ifc_ifcu.ifcu_buf
#define ifc_req ifc_ifcu.ifcu_req
#define IFNAMSIZ 16
struct ifreq {
char ifr_name[IFNAMSIZ];
union {
struct sockaddr ifru_addr;
struct sockaddr ifru_dstaddr;
struct sockaddr ifru_broadaddr;
short ifru_flags;
int ifru_metric;
caddr_t ifru_data;
}ifr_ifru;
};
#define ifr_addr ifr_ifru.ifru_addr
#define ifr_dstaddr ifr_ifru.ifru_dstaddr
#define ifr_broadaddr ifr_ifru.broadaddr
#define ifr_flags ifr_ifru.ifru_flags
#define ifr_metric ifr_ifru.ifru_metric
#define ifr_data ifr_ifru.ifru_data
在调用ioctl之前分配一个缓冲区和一个ifconf结构,然后初始化后者,iotctl的第三个参数指向ifconf结构。
一个实现获取所有接口的程序,可参见unpv12e:lib/get_ifi_info.c
(4)接口操作
· SIOCGIFCONF:从内核中获取系统中配置的所有接口。
(5)ARP高速缓存操作
(6)路由表操作
原文:http://www.cnblogs.com/riky/archive/2006/11/24/570713.aspx
chinaunix网友2010-09-29 14:36:49
很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com