网络编程学习笔记1

1、EPOLLRDHUP 表示读关闭

2、EPOLLHUP 表示读写都关闭

3、assert()断言函数
用于在调试过程中捕捉程序的错误。 括号里的值为非0 则什么事也不会发送

如果为0 或者false 表明程序出错,assert() 会向标准输出设备(一般是显示器)打印一条错误信息,并调用 abort() 函数终止程序的执行。

4、setsockopt

在TCP连接中,recv等函数默认为阻塞模式(block),即直到有数据到来之前函数不会返回,而我们有时则需要一种超时机制使其在一定时间后返回而不管是否有数据到来,这里我们就会用到setsockopt()

5、优雅关闭是什么

优雅关闭是在结束传输的时候调用shutdown函数而不是close/closesocket函数
调用close之后,即便仍有数据未发送,或者发送的数据尚未确认收到,对应的fd也会被销毁,也就是说连接直接中断
调用shutdown,并且设置了参数SO_LINGER>0(该参数代表延时事件)之后,连接只有超过这个事件,或者发送完数据才会中断。
shutdown()不会销毁fd,它只会关闭字节流,但是会给对方发送FIN信号

 linger.l_onoff = 1;
           linger.l_linger = 1;
           setsockopt(fd, SOL_SOCKET, SO_LINGER, (char *) &linger, sizeof(linger));

6、EPOLLONESHOT

一个socket上的某个事件还是可能被触发多次.这在并发程序中会引发一个问题.
比如一个线程在读取完某个socket上的数据后开始处理这些数据,而在数据的处理过程中,该socket上又有新数据可读(EPOLLIN再次被触发),此时另外一个线程被唤醒来读取这些新的数据.于是出现了两个线程同时操作一个socket的局面.我们期望的是一个socket连接在任何一个时刻只能被一个线程处理.

对于注册了EPOLLONESHOT事件的文件描述符,操作系统最多只触发其上注册的一个可读,可写,异常事件,且只触发一次.除非我们使用epoll_ctl函数重置该文件描述符上注册的EPOLLONESHOT事件.

参考链接:http://www.voidcn.com/article/p-kxwjnibc-bmd.html

猜你喜欢

转载自blog.csdn.net/psq1508690245/article/details/118052810
今日推荐