控制socket文件描述符属性

1.set/getsockopt()修改socket属性

int getsockopt (int __fd, int __level, int __optname, void *__restrict __optval, socklen_t *__restrict __optlen):获得某个套接字的属性。成功0,失败-1

int setsockopt (int __fd, int __level, int __optname, __const void *__optval, socklen_t __optlen) :设置某个套接字属性

参数1:套接字描述符。

参数2:指定套接字属性的分类,标识某个协议级别

#define SOL_SOCKET   1    //通用套接字选项
#define IPPROTO_IP 0 //IP选项
#define IPPROTO_TCP 6 //TCP选项

参数3:指定控制的参数,在参数2不同的情况下有不同选项

SOL_SOCKET的选项如下:

IPPROTO_IP选项如下:

IPPROTO_TCP选项如下:

参数4:套接字选项值,根据选项名称的数据类型进行转换

参数5:缓冲区大小,返回时为反向的值的长度。

例子:列出某个socket对象的基本信息

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<netinet/tcp.h>
#include<sys/socket.h>
#include<sys/wait.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/time.h>
int main(int argc, char *argv[])
{
int rcvbuf_size;
int sndbuf_size;
int type = ;
socklen_t size;
int sock_fd;
struct timeval set_time, ret_time;
if((sock_fd = socket(AF_INET, SOCK_STREAM, )) == -)
{
perror("socket");
exit(EXIT_FAILURE);
}
//获取发送缓冲区大小
size = sizeof(sndbuf_size);
getsockopt(sock_fd, SOL_SOCKET, SO_SNDBUF, &sndbuf_size, &size);
printf("sndbuf_size = %d\n", sndbuf_size);
//获取接收缓冲区大小
size = sizeof(rcvbuf_size);
getsockopt(sock_fd, SOL_SOCKET, SO_RCVBUF, &rcvbuf_size, &size);
printf("rcvbuf_size = %d\n", rcvbuf_size);
//获取socket类型
size = sizeof(type);
getsockopt(sock_fd, SOL_SOCKET, SO_TYPE, &type, &size);
printf("type = %d\n", type);
//获取发送超时值
size = sizeof(struct timeval);
getsockopt(sock_fd, SOL_SOCKET, SO_SNDTIMEO, &ret_time, &size);
printf("default: time out is %ds and %dus\n", ret_time.tv_sec, ret_time.tv_usec);
//修改超时值
set_time.tv_sec = ;
set_time.tv_usec = ;
setsockopt(sock_fd, SOL_SOCKET, SO_SNDTIMEO, &set_time, size);
getsockopt(sock_fd, SOL_SOCKET, SO_SNDTIMEO, &ret_time, &size);
printf("after modify: time out is %ds and %dus\n", ret_time.tv_sec, ret_time.tv_usec);
//读取TTL值
int ttl = ;
size = sizeof(ttl);
getsockopt(sock_fd, IPPROTO_IP, IP_TTL, &ttl, &size);
printf("the default ip ttl is %d\n", ttl);
//读取TCP_MAXSEG值
int maxseg = ;
size = sizeof(maxseg);
getsockopt(sock_fd, IPPROTO_TCP, TCP_MAXSEG, &maxseg, &size);
printf("the TCP max seg is %d\n", maxseg);
}

效果

2.fcntl控制socket

1.控制socket为非阻塞方式

int flags;
if((flags = fcntl(fd, F_GETFL, )) < )
{
perror("fcntl");
exit(EXIT_FAILURE);
}
flags |= O_NONBLOCK;
if(fcntl(fd, F_SETFL, flags) < )
{
perror("fcntl");
exit(EXIT_FAILURE);
}

2.设置socket为信号驱动型。socket状态改变时产生SIGIO信号

int flags;
if((flags = fcntl(fd, F_GETFL, )) < )
{
perror("fcntl");
exit(EXIT_FAILURE);
}
flags |= O_ASYNC;
if(fcntl(fd, F_SETFL, flags) < )
{
perror("fcntl");
exit(EXIT_FAILURE);
}

3.使用F_SETOWN选项设置socket的拥有者以及接收SIGIO和SIGURG信号。

fcntl(socket, F_SETOWN, getpid());

4.使用F_GETOWN选项获取某socket拥有者

fcntl(socket, F_GETOWN, getpid());

3.ioctl控制文件描述符

可以对socket文件描述符执行特殊处理。需要#include<stropts.h>

int ioctl (int fildes, int request, ... /*arg*/)

常用选项:

文件相关操作:

Socket相关操作

网络接口配置控制

ARP cache操作

RARP cache控制

第三个参数有专门的数据结构struct ifreq提供具体的操作

例子:获取本机端口eth0所对应的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, );
strcpy(ifr.ifr_name, "eth0");
if(ioctl(inet_sock, SIOCGIFADDR, &ifr) < )
perror("ioctl");
printf("%s\n", inet_ntoa(((struct sockaddr_in*)&(ifr.ifr_addr))->sin_addr));
}

获取指定接口的MAC地址

#include<net/if.h>
#include<sys/ioctl.h>
#include<string.h>
#include<stdio.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<stdlib.h> int main(int argc, char * argv[])
{
int i;
struct ifreq ifreq;
int sock;
char mac[];
if((sock = socket(AF_INET, SOCK_STREAM, )) < )
{
perror("error");
exit(EXIT_FAILURE);
}
strcpy(ifreq.ifr_name, argv[]);
if(ioctl(sock, SIOCGIFHWADDR, &ifreq) < )
{
perror("error:");
exit(EXIT_FAILURE);
}
//输出MAC信息
for(i = ; i < ; i++)
{
sprintf(mac + * i, "%02x:", (unsigned char)ifreq.ifr_hwaddr.sa_data[i]);
}
mac[] = '\0';
printf("mac addr is: %s\n", mac);
return ;
}

【linux高级程序设计】(第十四章)TCP高级应用 3的更多相关文章

  1. 读书笔记 - js高级程序设计 - 第十五章 使用Canvas绘图

    读书笔记 - js高级程序设计 - 第十三章 事件   canvas 具备绘图能力的2D上下文 及文本API 很多浏览器对WebGL的3D上下文支持还不够好   有时候即使浏览器支持,操作系统如果缺缺 ...

  2. linux高级管理第十四章--kvm虚拟化

    案例 安装kvm所需软件 验证 注:虚拟机要开启虚拟引擎 开启服务 环境准备 安装相关软件包 启动 创建网桥 重启,reboot 安装虚拟机 完成.

  3. 第十四章:高级I/O

    14.1:引言 本章内容包括非阻塞I/O.记录锁.系统V流机制.I/O多路转接(select和poll函数).readv和writev函数以及存储映射I/O(mmap),这些都称为高级I/O. 14. ...

  4. 鸟哥的Linux私房菜——第十四章:Bash Shell

    视频链接:http://www.bilibili.com/video/av10094012/ 本章目录: 1. Bash shell1.1 什么是 shell ? (我们通过shell与Kernel核 ...

  5. 【TCP/IP详解 卷一:协议】第二十四章 TCP的未来与性能

    来到了TCP的最后一个章节,未来与性能.在当时(1991年)的未来,如今已经部分变为现实,部分就只是历史中的实验. 主要内容: 路径MTU的发现与TCP的结合. 长肥管道 和 高速千兆比网络. 窗口扩 ...

  6. 【读书笔记】C#高级编程 第二十四章 文件和注册表操作

    (一)文件和注册表 对于文件系统操作,相关的类几乎都在System.IO名称空间中,而注册表操作由System.Win32名称空间中的类来处理. (二)管理文件系统 System.MarshalByR ...

  7. 《javascript高级程序设计》第四章 Variables,scope,and memory

    4.1 基本类型和引用类型的值 primitive and reference values 4.1.1 动态的属性 dynamic properties 4.1.2 复制变量值 copying va ...

  8. JavaScript高级程序设计:第四章

    变量.作用域和内存问题 1.ECMAScript变量可能包含两种不同数据类型的值:基本类型值和引用类型值.基本类型值指的是简单的数据段,引用类型值指的是有多个值构成的对象. 2.动态的属性:定义一个基 ...

  9. 《JAVASCRIPT高级程序设计》第四章

    javascript变量是松散类型,它只是在特定时间表示特定值的一个名字而已:变量的值以及类型,可以在脚本的生命周期内改变.变量的类型,分为基本类型和引用类型两种,具体介绍如下图所示: 执行环境是Ja ...

  10. 《JavaScript 高级程序设计》第四章:变量、作用域和内存问题

    目录 变量的引用 执行环境及作用域 作用域链延长 块级作用域 垃圾回收机制 变量的引用 当一个变量保存了基本数据类型时,此时对于变量的操作(赋值,运算)就是操作这个基本数据的本身,就算是赋值操作,赋值 ...

随机推荐

  1. python语法root=Tkinter.Tk()

    1. Tkinter 是一个python模块,是一个调用Tcl/Tk的接口,它是一个跨平台的脚本图形界面接口.Tkinter不是唯一的python图形编程接口,但是是 其中比较流行的一个.最大的特点是 ...

  2. stop-hbase.sh出现stopping hbasecat:/tmp/hbase-root-master.pid:No such file or directory

    stop-hbase.sh出现stopping hbasecat:/tmp/hbase-root-master.pid:No such file or directory解决办法:在hbase-env ...

  3. iOS笔记057 - UI总结03

    控制器的父子关系 1.控制器父子关系的建立原则        如果2个控制器的view是父子关系(不管是直接还是间接的父子关系),那么这2个控制器也应该为父子关系 [self.view addSubv ...

  4. mysql一机多实例安装记录

    因为想研究mycat,所以需要安装多个mysql实例进行研究.限于没有多于计算机,只能在本机安装了.通过mysql文档,自己琢磨着安装成功! 目录结构如下: 其中one和two文件夹用来模拟数据库分库 ...

  5. loadrunner破解出现“license security violation,Operation is not allowed”的错误提示

    1.关闭loadrunner,将破解文件(“lm70.dll”.“mlr5lprg.dll”)放置在LoadRunner\bin下面 2.以管理员身份运行loadrunner,在CONFUGURATI ...

  6. Pythontutor:可视化代码在内存的执行过程

    http://www.pythontutor.com/visualize.html今天去问开发一个Python浅拷贝的问题,开发给了一个神器,可以可视化代码在内存的执行过程,一看即懂,太NB了!~真是 ...

  7. 利用nat.123实现SVN外网访问

    背景: 在高效平台的合作中,我们用到了很多团队合作开发的工具,比如SVN.禅道.Confluence等等.有了这些工具,我们可以很好的进行团队合作交流.但同样有所限制,这些工具都是发布在局域网中,只能 ...

  8. asp+access win2008php+mysql /dedecms 配置总结

    1.  IIS 应用池  高级设置  启用32位应用程序:True 2. c盘window/Temp user 应该有管理权限           如果不行 creator owner 给予修改权限 ...

  9. BZOJ1025 [SCOI2009]游戏 【置换群 + 背包dp】

    题目链接 BZOJ1025 题解 题意就是问一个\(1....n\)的排列在同一个置换不断重复下回到\(1...n\)可能需要的次数的个数 和置换群也没太大关系 我们只需知道同一个置换不断重复,实际上 ...

  10. BZOJ2208 [Jsoi2010]连通数 【图的遍历】

    题目 输入格式 输入数据第一行是图顶点的数量,一个正整数N. 接下来N行,每行N个字符.第i行第j列的1表示顶点i到j有边,0则表示无边. 输出格式 输出一行一个整数,表示该图的连通数. 输入样例 3 ...