【原创】《Linux高级程序设计》杨宗德著 - TCP高级应用 - socket文件描述符属性控制
2014-12-06 10:26
711 查看
【原创】《Linux高级程序设计》杨宗德著 - TCP高级应用 - socket文件描述符属性控制
int setsockopt(int sockfd,int level,int optname,const void *optval,socklen_t *optlen)
level指定控制套接字的层次.可以取三种值:
1)SOL_SOCKET:通用套接字选项.
2)IPPROTO_IP:IP选项.
3)IPPROTO_TCP:TCP选项.
对应的optname详细说明
optname指定控制的方式(选项的名称).
选项名称 说明 数据类型
======================================================================
SOL_SOCKET
SO_BROADCAST 允许发送广播数据 int
SO_DEBUG 允许调试 int
SO_DONTROUTE 不查找路由 int
SO_ERROR 获得套接字错误 int
SO_KEEPALIVE 保持连接 int
SO_LINGER 延迟关
SO_OOBINLINE 带外数据放入正常数据流 int
SO_RCVBUF 接收缓冲区大小 int
SO_SNDBUF 发送缓冲区大小 int
SO_RCVLOWAT 接收缓冲区下限 int
SO_SNDLOWAT 发送缓冲区下限 int
SO_RCVTIMEO 接收超时 struct timeval
SO_SNDTIMEO 发送超时 struct timeval
SO_REUSERADDR 允许重用本地地址和端口 int
SO_TYPE 获得套接字类型 int
SO_BSDCOMPAT 与BSD系统兼容 int
IPPROTO_IP
IP_HDRINCL 在数据包中包含IP首部 int
IP_OPTINOS IP首部选项 int
IP_TOS 服务类型
IP_TTL 生存时间 int
IPPRO_TCP
TCP_MAXSEG TCP最大数据段的大小 int
TCP_NODELAY 不使用Nagle算法 int
optval获得或者是设置套接字选项.根据选项名称的数据类型进行转换 ,有时是套接字选项.ON或者OFF等
上述fcntl函数调用中,各参数定义如下:
handle:已打开的文件句柄。
option:一般可以是下列两种值:
F_GETFL:表示读取文件状态值。
F_SETFL:表示设置文件状态值。
(注意:F_GETFL和F_SETFL都被定义在fcntl.h)
mode:如果optipn是F_GETFL,则这个参数值可以是任意值。如果是F_SETFL,则参数值可以是下列值:
O_WRONLY:将文件设置成只写状态。
O_RDWR: 将文件设置成读写状态。
O_RDONLY:将文件设置成只读状态。
status:函数会将调用结果赋给status,如运行失败,则status的值会被设成-1。
控制socket为非阻塞方式
设置socket为信号驱动型socket,其将使socket在状态发生改变时产生SIGIO信号。
(3)使用F_SETOWN选项设置socket的拥有者以接收SIGIO和SIGURG 信号。如下示例:
fcntl(socket, F_SETOWN, getpid());
(4)使用F_GETOWN选项获取某socket的拥有者。
fcntl(socket, F_GETOWN, getpid());
ioctl的控制选项
SIOCATMARK 是否到达带外标记 int
FIOASYNC 异步输入/输出标志 int
FIONREAD 缓冲区可读的字节数 int
详细的选项请用 man ioctl_list 查看.
1. getsockopt和setsockopt修改socket属性
int getsockopt(int sockfd,int level,int optname,void *optval,socklen_t *optlen)int setsockopt(int sockfd,int level,int optname,const void *optval,socklen_t *optlen)
level指定控制套接字的层次.可以取三种值:
1)SOL_SOCKET:通用套接字选项.
2)IPPROTO_IP:IP选项.
3)IPPROTO_TCP:TCP选项.
对应的optname详细说明
optname指定控制的方式(选项的名称).
选项名称 说明 数据类型
======================================================================
SOL_SOCKET
SO_BROADCAST 允许发送广播数据 int
SO_DEBUG 允许调试 int
SO_DONTROUTE 不查找路由 int
SO_ERROR 获得套接字错误 int
SO_KEEPALIVE 保持连接 int
SO_LINGER 延迟关
SO_OOBINLINE 带外数据放入正常数据流 int
SO_RCVBUF 接收缓冲区大小 int
SO_SNDBUF 发送缓冲区大小 int
SO_RCVLOWAT 接收缓冲区下限 int
SO_SNDLOWAT 发送缓冲区下限 int
SO_RCVTIMEO 接收超时 struct timeval
SO_SNDTIMEO 发送超时 struct timeval
SO_REUSERADDR 允许重用本地地址和端口 int
SO_TYPE 获得套接字类型 int
SO_BSDCOMPAT 与BSD系统兼容 int
IPPROTO_IP
IP_HDRINCL 在数据包中包含IP首部 int
IP_OPTINOS IP首部选项 int
IP_TOS 服务类型
IP_TTL 生存时间 int
IPPRO_TCP
TCP_MAXSEG TCP最大数据段的大小 int
TCP_NODELAY 不使用Nagle算法 int
optval获得或者是设置套接字选项.根据选项名称的数据类型进行转换 ,有时是套接字选项.ON或者OFF等
2. fcntl控制socket
status = fcntl (hand, option, mode ) ;上述fcntl函数调用中,各参数定义如下:
handle:已打开的文件句柄。
option:一般可以是下列两种值:
F_GETFL:表示读取文件状态值。
F_SETFL:表示设置文件状态值。
(注意:F_GETFL和F_SETFL都被定义在fcntl.h)
mode:如果optipn是F_GETFL,则这个参数值可以是任意值。如果是F_SETFL,则参数值可以是下列值:
O_WRONLY:将文件设置成只写状态。
O_RDWR: 将文件设置成读写状态。
O_RDONLY:将文件设置成只读状态。
status:函数会将调用结果赋给status,如运行失败,则status的值会被设成-1。
控制socket为非阻塞方式
设置socket为信号驱动型socket,其将使socket在状态发生改变时产生SIGIO信号。
(3)使用F_SETOWN选项设置socket的拥有者以接收SIGIO和SIGURG 信号。如下示例:
fcntl(socket, F_SETOWN, getpid());
(4)使用F_GETOWN选项获取某socket的拥有者。
fcntl(socket, F_GETOWN, getpid());
3. ioctl控制文件描述符
#include <stropts.h> int ioctl(int fildes, int request, ... /* arg */);ioctl可以控制所有的文件描述符的情况,这里介绍一下控制套接字的选项.
ioctl的控制选项
SIOCATMARK 是否到达带外标记 int
FIOASYNC 异步输入/输出标志 int
FIONREAD 缓冲区可读的字节数 int
详细的选项请用 man ioctl_list 查看.
ioctl示例代码
ioctl获取本地IP地址
#include <net/if.h> #include <sys/ioctl.h> #include <string.h> #include <stdio.h> #include <sys/socket.h> #include <arpa/inet.h> int main() { int inet_sock; struct ifreq ifr; inet_sock = socket(AF_INET, SOCK_DGRAM, 0); strcpy(ifr.ifr_name, "eth0"); if (ioctl(inet_sock, SIOCGIFADDR, &ifr) < 0) perror("ioctl"); printf("%s\n", inet_ntoa(((struct sockaddr_in*)&(ifr.ifr_addr))->sin_addr)); }运行结果
$ ./ioctl_getaddr 172.18.229.62<span style="color:#339999;"> </span>
ioctl获取指定接口的MAC地址
#include<stdlib.h> #include<stdio.h> #include<string.h> #include<sys/ioctl.h> #include<sys/socket.h> #include<netinet/in.h> #include<net/if.h> // argv[0] portname ,such as argv[0] eth0 int main(int argc, char *argv[]) { int i; struct ifreq ifreq; int sock; char mac[32]; if((sock=socket(AF_INET,SOCK_STREAM,0))<0) { perror("error"); exit(EXIT_FAILURE); } strcpy(ifreq.ifr_name,argv[1]); if(ioctl(sock,SIOCGIFHWADDR,&ifreq)<0) { perror("error:"); exit(EXIT_FAILURE); } for (i=0; i<6; i++) sprintf(mac+3*i, "%02x:", (unsigned char)ifreq.ifr_hwaddr.sa_data[i]); mac[17]='\0'; printf("mac addr is: %s\n", mac); return 0; }运行结果
$ ./get_port_mac eth0 mac addr is: 00:0c:29:xx:xx:xx
原文链接
http://blog.csdn.net/geng823/article/details/41773735相关文章推荐
- 【原创】《Linux高级程序设计》杨宗德著 - TCP高级应用 - socket文件描述符属性控制 分类: Linux --- 应用程序设计 2014-12-06 10:26 61人阅读 评论(0) 收藏
- Linux网络编程 - TCP高级应用:socket文件描述符属性控制
- 【原创】《Linux高级程序设计》杨宗德著 - TCP高级应用 - 多路复用 分类: Linux --- 应用程序设计 2014-12-05 17:57 77人阅读 评论(0) 收藏
- 【原创】《Linux高级程序设计》杨宗德著 - TCP高级应用 - 多路复用
- 【原创】《Linux高级程序设计》杨宗德著 - Linux多线程编程 - 线程属性控制 分类: Linux --- 应用程序设计 2014-11-30 20:54 68人阅读 评论(0) 收藏
- 【原创】《Linux高级程序设计》杨宗德著 - Linux多线程编程 - 线程属性控制
- 【原创】《Linux高级程序设计》杨宗德著 - 进程管理与程序开发 - 信号应用实例
- 【原创】《Linux高级程序设计》杨宗德著 - Linux Socket网络编程基础 - BSD Socket网络通信编程 分类: Linux --- 应用程序设计 2014-12-05 16:53 63人阅读 评论(0) 收藏
- Qt下应用QTcpServer与QTcpSocket实现Tcp控制
- 【原创】《Linux高级程序设计》杨宗德著 - 进程管理与程序开发 - 进程资源及属性
- 【原创】《Linux高级程序设计》杨宗德著 - Linux Socket网络编程基础 - 网络通信基础 分类: Linux --- 应用程序设计 2014-12-03 22:46 71人阅读 评论(0) 收藏
- 【原创】《Linux高级程序设计》杨宗德著 - Linux Socket网络编程基础 - 网络调试工具 分类: Linux --- 应用程序设计 2014-12-05 17:19 84人阅读 评论(0) 收藏
- 【原创】《Linux高级程序设计》杨宗德著 - 进程管理与程序开发 - 进程资源及属性
- 【原创】《Linux高级程序设计》杨宗德著 - Linux Socket网络编程基础 - 网络通信基础
- 【原创】《Linux高级程序设计》杨宗德著 - Linux Socket网络编程基础 - 网络调试工具
- 【原创】《Linux高级程序设计》杨宗德著 - Linux Socket网络编程基础 - BSD Socket网络通信编程
- 【原创】《Linux高级程序设计》杨宗德著 - 进程管理与程序开发 - 信号应用实例 分类: Linux --- 应用程序设计 2014-11-09 11:33 66人阅读 评论(0) 收藏
- 【原创】《Linux高级程序设计》杨宗德著 - UDP网络编程应用 分类: Linux --- 应用程序设计 2014-12-11 14:41 73人阅读 评论(0) 收藏
- Http(应用层)-->Socket-->TCP/UDP(传输层)--Socket>-->Http(应用层)
- 黑马程序员_Socket学习日记之TCP的讲解与应用