欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > 网络编程_day6

网络编程_day6

2025/2/24 23:33:39 来源:https://blog.csdn.net/weixin_63791423/article/details/143325532  浏览:    关键词:网络编程_day6

目录

【0】复习

并发服务器实现思路梳理

多进程

多线程

IO多路复用select

【1】setsockopt:设置套接字属性

socket属性

设置地址重用

【2】超时检测

必要性

超时检测的设置方法

1. 通过函数自带的参数设置

2. 通过设置套接字属性进行设置

3. alarm函数与sigaction函数结合

【3】广播与组播(broadcast & multicast)

1. 广播(udp)

理论:

发送者

接收者

缺点:

2. 组(多)播(udp)

理论

发送者

接收者

【4】本地套接字

特性

流程(tcp为例)

客户端

服务器


【0】复习

linux IO模型:阻塞IO、非阻塞IO、信号驱动IO

IO多路复用(并发):select(特点)、poll(特点)、epoll(特点)

服务器模型:循环服务器(一个服务器在同一时间只能处理一个客户端的请求)、

并发服务器(一个服务器在同一时可以处理多个客户端的请求)(多进程、多线程、IO多路复用select)

并发服务器实现思路梳理

多进程

多进程实现并发
并发:一个服务器可以同时连接多个客户端(同时与多个客户端通信)
什么时间创建多进程?accept之后fork
父:accept----》阻塞
fork
子:recv----》阻塞利用信号SIGCHLD进行回收子进程资源handler()
{
waitpid();
}main()
{socket();bind();listen();signal(SIGCHLD,handler); while(1){accept();pid=fork();if(pid==0){while(1)recvexit();}elseclose();}}

多线程

多线程实现并发
什么时间创建多线程?
主:accept
创建线程pthread_create
子:recv
如果把accept函数的返回值定义为全局变量,那么acceptfd会是最后一次链接的客户端的用于通信的文件描述符handler(void*)
{
//类型准换int acceptfd=*((int *)arg);while(1)recv();
}main()
{socket();bind();listen();while(1){acceptfd=accept();//传参pthread_create(handler,&acceptfd);pthread_detach();}
}

IO多路复用select

select:一张文件描述符的表
将关心的文件描述符添加到表中,内核监听,当内核监听的表中有文件描述符产生事件,未发生事件的文件描述符会清0,select返回,我们需要判断到底是哪一个或者哪些文件描述符发生了事件,最对应的逻辑处理main
{sockfd=socket();bind();listen();有表;FD_ZERO();FD_SET(sockfd);while(1){// 一定要注意,要有备份表//备份表:保留关心的文件描述符,确保不会被select修改select();if(FD_ISSET(sockfd))acceptfd=accept();FD_SET(acceptfd);//从原表添加for(int i=sockfd+1;i<=max;i++){if(FD_ISSET(i))ret=recv(i);if(ret==0)FD_CLR(i);//从原表删除}}
}

【1】setsockopt:设置套接字属性

set:设置 sock:套接字 option:属性

int setsockopt(int sockfd,int level,int optname,void *optval,socklen_t optlen)
功能:获得/设置套接字属性
参数:
sockfd:套接字描述符
level:协议层
optname:选项名
optval:选项值
optlen:选项值大小
返回值:     成功 0                  失败-1

socket属性

int 类型中 允许则为1或其他值 , 不允许则为0

选项名称

说明

数据类型

========== SOL_SOCKET 应用层 ===========

SO_BROADCAST

允许发送广播数据

int

SO_DEBUG

允许调试

int

SO_DONTROUTE

不查找路由

int

SO_ERROR

获得套接字错误

int

SO_KEEPALIVE

保持连接

int

SO_LINGER

延迟关闭连接

struct 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_REUSEADDR

允许重用本地地址和端口

int

SO_TYPE

获得套接字类型

int

SO_BSDCOMPAT

与BSD系统兼容

int

========== IPPROTO_IP IP层/网络层 =============

IP_HDRINCL

在数据包中包含IP首部

int

IP_OPTINOS

IP首部选项

int

IP_TOS

服务类型

int

IP_TTL

生存时间

int

IP_ADD_MEMBERSHIP

将指定的IP加入多播组

struct ip_mreq

========== IPPRO_TCP 传输层 ============

TCP_MAXSEG

TCP最大数据段的大小

int

TCP_NODELAY

不使用Nagle算法

int

 

 

设置地址重用

 

【2】超时检测

必要性

  1. 避免进程进入无限制的阻塞
  2. 在规定的时间内未完成相应的语句,可以执行其他的语句

超时检测的设置方法

1. 通过函数自带的参数设置

select poll

2. 通过设置套接字属性进行设置

3. alarm函数与sigaction函数结合

int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);
功能:对接收到的指定信号处理
参数:signum:要捕获的信号act:接收到信号之后对信号进行处理的结构体oldact:接收到信号之后,保存原来对此信号处理的各种方式与信号(可用来做备份)。如果不需要备份,此处可以填NULL
struct sigaction 
{void     (*sa_handler)(int); //信号处理函数void     (*sa_sigaction)(int, siginfo_t *, void *);  //查看信号的各种详细信息sigset_t   sa_mask;int        sa_flags;      //信号属性; SA_RESTART自重启属性
#define SA_RESTART  0x10000000void     (*sa_restorer)(void);//不再使用};     //设置信号属性struct sigaction act;sigaction(SIGALRM,NULL,&act);//获取原属性act.sa_handler=handler;//修改属性sigaction(SIGALRM,&act,NULL);//将修改的属性设置回去
返回值:成功:0出错:-1,并将errno设置为指示错误

 

【3】广播与组播(broadcast & multicast)

1. 广播(udp)

理论:

前面介绍的数据包发送方式只有一个接受方,称为单播

如果同时发给局域网中的所有主机,称为广播

只有用户数据报(使用UDP协议)套接字才能广播

一般被设计成局域网搜索协议

● 广播地址:局域网中主机号最大的一个 192.168.50.255

发送者

  1. 创建数据报套接字
  2. 由于原本的套接字不允许广播,所以要设置广播属性
  3. 指定网络信息(接收者)
  4. 发送消息
  5. 关闭套接字

 

接收者

  1. 创建数据报套接字
  2. 指定网络信息(接收者)
  3. 绑定套接字
  4. 接收消息
  5. 关闭套接字

缺点:

    广播方式发给所有的主机,过多的广播会大量的占用网络带宽,造成广播风暴,影响正常的通信

广播风暴: 网络长时间被大量的广播数据包所占用,使正常的点对点通信无法正常进行,其外在表现为网络速度奇慢无比,甚至导致网络瘫痪

2. 组(多)播(udp)

理论

单播方式只能发给一个接收方。

广播方式发给所有的主机。过多的广播会大量占用网络带宽,造成广播风暴,影响正常的通信。

播是一个人发送,加入到多播组的人接收数据。

多播方式既可以发给多个主机,又能避免像广播那样带来过多的负载(每台主机要到传输层才能判断广播包是否要处理)

 D类:224.0.0.0-239.255.255.255

发送者

  1. 创建数据报套接字
  2. 指定网络信息(接收者)
  3. 发送消息
  4. 关闭套接字

接收者

  1. 创建数据报套接字
  2. 设置多播属性,将自己的IP加入到多播组中
  3. 指定网络信息(接收者)
  4. 绑定套接字
  5. 接收消息
  6. 关闭套接字

 

 

【4】本地套接字

特性

  1. socket同样可以用于本地间进程通信,创建套接字时使用本地协议AF_LOCAL或AF_UNIX
  2. 分为流式套接字和数据报套接字
  3. 和其他进程间通信相比使用方便、效率更高,常用于前后台进程通信。

流程(tcp为例)

客户端

  1. socket()
  2. struct sockaddr_un
  3. connect
  4. send
  5. close

 

服务器

  1. socket()
  2. struct sockaddr_un
  3. bind
  4. listen
  5. accept
  6. recv
  7. close

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词