网络编程IO笔记
来源:互联网 发布:大数据交换平台 编辑:程序博客网 时间:2024/06/07 17:34
网络编程IO模型:
1.主要的4种IO模型:
①阻塞IO:最常用,简单,效率最低
②非阻塞IO:可防止进程阻塞在IO操作上,需要轮询。。。
③IO多路复用:允许同时对多个IO进行控制。
④信号驱动IO:
2.阻塞IO:
--read函数:----阻塞,需要内核去唤醒该进程。。。。
--write阻塞:主要发生的情况??
用户缓冲区:???数组。。
UDP无发送缓存区,写操作sendto永远都不会阻塞。()
3.非阻塞IO------使用比较少,了解有这种模式
--缓冲区满,不阻塞,它返回一个错误编号
--例如 waitpid(-1,&a, WHOHANG )
--例如 fifo
fnctl(fd,
--cmd:命令
--arg:
4.多路复用IO:(重点)
--一个进程处理多个人进程。。。。
--基本思想:先构造一张有关描述符的表fd_set
①fd_set
②FD_ZERO 作用相当于数组清零-----00000000000000
③FD_SET(0, &rdfs) 将文件描述符为0的地方(套接字缓存区),置一
③如果select 返回值大于0;则遍历数组
for (i= 0; i < ; i++)
{
{
accept。。。。
}
}
select函数特点:
①
②它把没就绪的位清0.
③作用查看缓冲区状态:
服务器模型:
1循环服务器
―――TCP服务器
―――UDP服务器
2.并发服务器
*********IO多路复用并发服务器*********
初始化(socket---bind---listen)
①fd_set
②FD_ZERO 作用相当于数组清零-----00000000000000
②
fd_set
FD_ZERO(&f1)
FD_SET( ,&f1)
while(1)
{
{
{
connfd = accept();
}
}
}
}
TCP并发服务器:
while(1){
close(listenfd);
while (1)
{
}
exit(0);//发送结束信号,异步方式解决僵尸问题
}
void
{
}
网络属性设置:
getsockopt()
setsockopt(sockfd, level, optname, *optval, socklen_t)
level: SOL_SOCKET
optname:
optval: 存放选项值的缓冲区长度地址
socklen_t: 缓冲长度
网络超时检测:
i.在网络通信中,很多操作都会使进程阻塞;TCP套接字中的recv/accept/connet和UDP套接字中的recvform;
超时检测的必要性:
i.避免进程在没有数据时无限的阻塞;ii.当设定时间到时,进程从原来的操作返回继续进行。
三种方法检测网络超时:
方法一:
设置套接字属性:SO_RCVTIMEO
struct
timev.tv_sec = 5;
timev.tv_usec = 0;
…….
setsocketopt(sockfd,SOL_SOCKET,
………
recv()/recvfrom…..//从套接字读取数据。。。
方法二:
用select检测socket是否准备就绪;
struct
struct
FD_ZERO(&rdfs);
FD_SET(sockfd, &rdfs);
if (select (sockfd,&rdfs,NULL,NULL,NULL,&tv) > 0) //sockfd就绪
{
}
方法三:
设置定时器timer,捕捉SIGALRM信号
void
struct
sigaction(SIGALRM, NULL,&act);
act.sa_hander
act.sa_flags
sigaction(SIGALRM, &act, NULL);
alarm(5);
if (recv(,,,) <0) ………
记住一两个错误编号和宏:
errno = 11 是连接超时
errno = 4
广播:
1.数据包发送方式只有一个接收方,叫单播;
2.同时发给局域网中的所有主机,称为广播;广播只能用户数据报,即UDP协议,套接字才能广播;
3.广播地址:
广播发送流程:创建数据报套接字---à设置setsockopt套接字属性---à指定接收方为广播地址--à指定端口信息---à发送数据包
sockfd = socket(; ; );
………..
int
setsockopt(socket,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on));
……..
sendto(………);
广播的接收流程:创建数据报套接字---à绑定本机IP地址和端口---à绑定的端口必须和发送方指定的端口相同----à等待接收数据;
注意绑定本机IP地址一般为(0.0.0.0)
组播:
只用加入某个多播组的主机才能收到数据;
网络地址:ABCD类地址
下面是广播和组播图:
组播的发送方流程:
socket--àsendto---à选择D类地址---àsleep(1)
组播的接收方流程:创建用户数据报套接字--à加入多播组---à绑定本机的IP地址和端口--à等待接收数据
socket--àsetsockopt---àbind---àrecvfrom
libcap编程:
- 网络编程IO笔记
- unix网络编程笔记(四)--IO复用
- UNIX网络编程笔记(10)—高级IO函数
- UNIX网络编程笔记(12)—非阻塞IO
- UNIX网络编程笔记 第六章 IO复用
- Java -网络IO编程
- Java 网络IO编程
- [网络编程] IO多路复用
- 网络模型&网络编程&io
- IO特性(1): socket相关的几个高级IO函数(Unix网络编程笔记)
- 网络编程--IO模型示例
- 网络编程--IO模型示例
- 网络编程--IO模型示例
- 网络编程--IO模型示例
- 网络编程--IO模型示例
- Linux网络编程 IO多路复用
- LINUX网络编程 IO 复用
- 网络编程中的IO复用
- 单链表头指针、头结点、头元结的辨…
- Linux Umask介绍
- 标准I/O缓存的一些理解
- linux中path路径的转换
- 网络编程中的超时检测
- 网络编程IO笔记
- Launcher源码浅析-----Launcher自定义布局属性
- C语言 printf函数对参数的计算顺序自加自减的讨论
- ARM基础——学习笔记
- kmalloc()和vmalloc()的区别
- 内核的延时函数
- 浅谈platform设备模型
- 内核定时器
- android中finish(),exit()的区别