Chinaunix首页 | 论坛 | 博客
  • 博客访问: 426247
  • 博文数量: 47
  • 博客积分: 1669
  • 博客等级: 上尉
  • 技术积分: 585
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-04 23:27
文章分类

全部博文(47)

文章存档

2011年(23)

2010年(24)

分类: 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_LOCALprotocol必须为0type可以是SOCK_STREAMSOCK_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.1gsockatmark代替了这种请求。

·  SIOCGPGRP:通过第三个参数指向的整数返回为接收来自这个套接口的SIGIOSIGURG信号而设置的进程ID或进程组ID。这和fcntlF_GETOWN相同。

·  SIOCSPGRP:用第三个参数指向的整数设置进程ID或进程组ID以接收这个套接口的SIGIOSIGURG信号。这和fcntlF_SETOWN相同。

(2)文件操作

·  FIONBIO:套接口的非阻塞标志会根据第三个参数指向的值是否为零而清除或设置。等价于fcntlF_SETFL设置/清除O_NONBLOCK标志。

·  FIOASYNC:根据第三个参数指向的值是否为零决定清除或接收套接口上的异步I/O信号。等价于fcntlF_SETFL设置和清除O_AYNC标志。

·  FIONREAD:在第三个参数指向的整数中返回套接口接收缓冲区中当前的字节数。

·  FIOSETOWN:在套接口上等价于SIOCSPGRP

·  FIOGETOWN:在套接口上等价于SIOCGPGRP

(3)接口配置

SIOCGIFCONF:从内核中获取系统中配置的所有接口。它使用了结构ifconfifconf又使用了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结构。

一个实现获取所有接口的程序,可参见unpv12elib/get_ifi_info.c

 

 

(4)接口操作

·  SIOCGIFCONF:从内核中获取系统中配置的所有接口。

(5)ARP高速缓存操作

(6)路由表操作

原文:http://www.cnblogs.com/riky/archive/2006/11/24/570713.aspx

阅读(1866) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-09-29 14:36:49

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com