大傻与小火机写字的地方


  • 首页

  • 分类

  • 归档

  • 关于

  • 标签

套接字I/O超时设置方法和用select实现超时 connect机制

发表于 2018-05-07 | 分类于 Linux网络编程 |

使用alarm函数设置超时

void handler(int sig)
{
}
signal(SIGALRM, handler);

alarm(5);
int ret = read(fd, buf, sizeof(buf));
if (ret == -1 && errno == EINTR) 
    errno = ETIMEOUT;
else if (ret >= 0)
    alarm(0);

EINTR为中断信号,如果read在5s内被SIGALRM信号中断而返回,则表示超时,否则未超时已读取到数据,取消闹钟。但这种方法不常用,因为有时可能在其他地方使用了alarm会造成混乱。

阅读全文 »

shutdown与close函数的区别

发表于 2018-05-06 | 分类于 Linux网络编程 |

有时候代码中需要连续多次调用write,可能还来不及调用read得知对方已关闭了连接就被SIGPIPE信号终止掉了,这就需要在初始化时调用sigaction处理SIGPIPE信号,对于这个信号的处理我们通常忽略即可,signal(SIGPIPE, SIG_IGN);如果SIGPIPE信号没有导致进程异常退出(捕捉信号/忽略信号),write返回-1并且errno为EPIPE。

阅读全文 »

使用select函数改进客户端/服务器端程序

发表于 2018-05-06 | 分类于 Linux网络编程 |

当我们使用单进程单连接且使用readline修改后的客户端程序,去连接使用readline修改后的服务器端程序。服务器主动close后,客户端和服务器会出现一个有趣的现象。

先运行服务器端,再运行客户端。建立连接后,服务器端有两个进程,一个父进程处于监听状态,另一子进程正在对客户端进行服务。kill掉服务器端的子进程。

阅读全文 »

五种I/O模型和select函数简介

发表于 2018-05-05 | 分类于 Linux网络编程 |

同步和异步的区别在于是不是要求处理消息者自己来完成将数据从内核缓冲区复制回进程缓冲区的过程。

消息者阻塞和非阻塞应该是发生在消息的处理的时刻。阻塞其实就是等待,发出通知,等待结果完成。非阻塞属于发出通知,立即返回结果,没有等待过程。

阅读全文 »

一个进程发起多个连接 gethostbyname等函数

发表于 2018-05-05 | 分类于 Linux网络编程 |

前面讲过的回射客户/服务器程序中,一个客户端即一个进程,只会发起一个连接,只要稍微修改一下就可以让一个客户端发起多个连接,然后只利用其中一个连接发送数据。

先来认识一个函数getsockname

#include <sys/socket.h>
int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

利用此函数可以得到某连接sockfd的地址信息,如ip地址和端口,这可以帮助我们判断发起了多少个连接。

阅读全文 »

利用recv和readn函数实现readline函数

发表于 2018-05-03 | 分类于 Linux网络编程 |

在前面的文章中,我们为了避免粘包问题,实现了一个readn函数读取固定字节的数据。如果应用层协议的各字段长度固定,用readn来读是非常方便的。

常见的应用层协议都是带有可变长字段的,字段之间的分隔符用换行’\n’的比用’\0’的更常见,如HTTP协议。可变长字段的协议用readn来读就很不方便了,为此我们实现一个类似于fgets的readline函数。

阅读全文 »

muduo库MutexLock类 MutexLockGuard类 Condition类 CountDownLatch类封装 ptr_vector小知识

发表于 2018-05-02 | 分类于 muduo网络库 |

MutexLock类

DartNet

阅读全文 »

pthread线程系列函数

发表于 2018-04-29 | 分类于 Linux网络编程 |

之前学过的系统函数都是成功返回0,失败返回-1,而错误号保存在全局变量errno中,而pthread库的函数都是通过返回值返回错误号。虽然每个线程也都有一个errno。

由于pthread线程系列函数的错误码不保存在errno中,因此不能直接用perror(3)打印错误信息,可以先用strerror(3)把错误号转换成错误信息再打印。

阅读全文 »

多进程和多线程实现并发回射服务器

发表于 2018-04-28 | 分类于 Linux网络编程 |

服务器只能处理一个客户端的请求,如何同时服务多个客户端呢?一个简单的方法就是使用fork来实现。网络服务器通常用fork来同时服务多个客户端,父进程专门负责监听端口,每次accept一个新的客户端连接就fork出一个子进程专门服务这个客户端。

由于子进程退出时会产生僵尸进程,父进程要注意处理SIGCHLD信号和调用wait清理僵尸进程,最简单的办法就是直接忽略SIGCHLD信号。将僵尸进程交给init进程来领养,回收子进程退出状态和其他信息。省去大量僵尸进程占用系统资源。

阅读全文 »

虚继承和虚函数对C++对象内存模型造成的影响 类/对象的大小

发表于 2018-04-28 | 分类于 再学C++ |
类的大小与数据成员有关与成员函数无关
类的大小与静态数据成员无关

虚继承对类的大小的影响
虚函数对类的大小的影响

只出现虚继承的情况

virtual base table
本类地址 与虚基类表指针地址的差
虚基类地址与虚基类表指针地址的差
virtual base table pointer(vbptr)

阅读全文 »
1…456…11
Shaojie Li

Shaojie Li

学习总结 思考感悟 知识管理

107 日志
15 分类
15 标签
RSS
© 2017 — 2019 Shaojie Li
由 Hexo 强力驱动
|
主题 — NexT.Mist v5.1.4