网络编程堵塞函数

堵塞函数

  • 缺省情况下,套接字建立后所处于的模式就是阻塞I/O 模式
  • 读操作中的read、recv、recvfrom
  • 写操作中的write、send
  • 其他操作:accept、connect

sendto 函数不堵塞

UDP不用等待确认,没有实际的发送缓冲区,所以UDP协议中不存在发送缓冲区满的情况,在UDP套接字上执行的写操作永远都不会阻塞。

以read函数为例:
进程调用read函数从套接字上读取数据,当套接字的接收缓冲区中还没有数据可读,函数read将发生阻塞。它会一直阻塞下去,等待套接字的接收缓冲区中有数据可读。经过一段时间后,缓冲区内接收到数据,于是内核便去唤醒该进程,通过read访问这些数据。如果在进程阻塞过程中,对方发生故障,那这个进程将永远阻塞下去。

fcntl()函数

当开始建立一个套接字描述符的时候,系统内核将其设置为阻塞IO模式。
可以使用函数fcntl()设置一个套接字的标志为O_NONBLOCK 来实现非阻塞。
代码实现;
1.fcntl( )函数

int fcntl(int fd, int cmd, long arg);
      int flag;
      flag = fcntl(sockfd, F_GETFL, 0);
      flag |= O_NONBLOCK;
      fcntl(sockfd, F_SETFL, flag);

2.ioctl() 函数

   int b_on =1;
   ioctl(sock_fd, FIONBIO, &b_on);

select()/poll()实现多路复用

#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

int select(int n, fd_set *read_fds, fd_set *write_fds, 
	       fd_set *except_fds, struct timeval *timeout);

// poll
#include <sys/poll.h>
int poll(struct pollfd *ufds, unsigned int nfds, int timeout);

select()参数

maxfd

所有监控的文件描述符中最大的那一个加1

read_fds

所有要读的文件文件描述符的集合

write_fds

所有要的写文件文件描述符的集合

except_fds

其他要向我们通知的文件描述符

timeout

超时设置.
Null:一直阻塞,直到有文件描述符就绪或出错
时间值为0:仅仅检测文件描述符集的状态,然后立即返回
时间值不为0:在指定时间内,如果没有事件发生,则超时返回

select宏
void FD_ZERO(fd_set *fdset)
void FD_SET(int fd,fd_set *fdset) 
void FD_CLR(int fd,fd_set *fdset) 
int FD_ISSET(int fd,fd_set *fdset) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值