技术控

78-socketpair 函数

如果涉及到父子进程间的通信,我们就没有必要弄的那么麻烦,不需要再创建套接字地址,不需要绑定。函数socketpair会创建两个连接好的套接字。1.socketpair函数intsocketpair(intfamily,intprotocol...

81-凭证的发送与接收

使用Unix域套接字作为辅助数据传递的另一种数据是用户凭证(usercredential)。FreeBSD使用structcmsgcred结构来传递凭证,此时辅助数据的type类型是SCM_CREDS.不过,我们讨论的是Linux,不同于F...

83-非阻塞 I/O

回顾一下上一篇文章,阻塞版本的writen固然好用,但是也有风险,我们不能把希望寄托在增加客户端TCP发送缓冲区和接收缓冲区的大小上,而是应该采取更加有保障的措施。前面说过,可以使用非阻塞IO,也可以使用多进程或多线程。本文,我们先来讨论一...

82-再议 select 版回射客户端

第一次,我们写的服务器客户端是停等版本,像下面这样:while(1){read(stdin);writen(sockfd);read(sockfd);writen(stdout);}后来,我们用select改进了它:while(1){rfd...

85-使用多线程改写回射客户端

上一篇文章中,我们已经见识了非阻塞I/O+缓冲区改写回射客户端的复杂性。本文我们使用多线程来重写客户端,后面可以看到,这个版本要简洁的多。1.程序路径本文使用的程序托管在gitos上,你可以使用下面的命令clone到你的电脑上:gitclo...

87-非阻塞 connect

非阻塞i/o上调用connect比非阻塞i/o上调用read/write要麻烦一点,一方面connect函数不能像read/write那样反复调用,它只能调用一次;另一方面,connect函数返回错误,并不代表连接建立不成功。1.非阻塞co...

86-时间获取客户端

本文来一点比较轻松的话题,来写一个客户端,从时间服务器(daytimeserver)上取得时间并打印。1.daytime服务器daytime服务器我们不用自己写了,这个网站列举了很多现成的daytime服务器地址:http://tf.nis...

89-非阻塞 accept

不知道你是否还记得异常连接——accept返回前连接终止。这篇文章探讨的是在accept函数调用前,连接被异常终止的情况。不过,很遗憾我们并未观察到accept产生异常。man手册中解释,linux会把错误转移到accept返回的新套接字(...

88-非阻塞 connect 版本的 web 客户程序

1.web客户程序目标:1)web客户程序建立与某个web服务器的HTTP连接,然后获取主页(这只是一个开胃菜,测试我们的web程序是否正常工作)。2)同时请求多个网络资源,并下载。(看起来很像多线程爬虫,但是我们不使用多线程,而是非阻塞c...

91-接收 IP 数据报

本文我们需要用到一种新的类型的套接字——RawSockets,原始套接字。如此重要的知识点,没有出现在大标题中,实在很抱歉。它出现的理由很简单,我们可以自己构造一个完整的IP数据报,通过原始套接字发送出去。也可以从原始套接字中读取一个完整的...

90-IP 协议(基础)

本章开始讲解ICMP协议,通过学习ICMP协议,我们可以顺便掌握RawSockets,中译名为原始套接字。在学习ICMP前,还需要简单的了解一下IP协议。IP协议是TCP/IP协议族中最核心的协议,TCP、UDP、ICMP等众多协议需要依赖...

92-ICMP 协议(基础)

ICMP协议(InternetControlMessagesProtocol,网际控制报文协议)是网络层最重要的协议之一。前面的实验我们也看到了,它由IP协议承载,封装在IP协议的数据部分。图1ICMP被封装在IP数据报的数据部分1.ICM...