专注于linux,网络

积一时之跬步,臻千里之遥程,非宁静无以致远,夫学须静也,才须学也,非学无以广才,非志无以成学...

linux编程学习目录

参考资料: 《UNIX环境高级编程第三版》 《Linux/UNIX系统编程手册》 《UNIX网络编程(第1卷:套接口API)》 《TCP/IP详解卷一》 Linux 学习交流群: 610441700 ,欢迎加群一起讨论 系统编程 文件I/O 1-文件IO—ope...

2018-07-22 23:13:33

阅读数 1027

评论数 2

21-非阻塞accept

1. 回忆accept函数 之前在10-在accept之前中止连接(连接异常)这一篇中已经讨论过在accept之前中止连接的情况了,不过从最终的结果来看,accept并没有返回错误,而是之后调用read读取已连接套接字时产生了错误。 另外,当一个已完成连接正等待被服务端accept时,se...

2019-01-07 14:58:41

阅读数 404

评论数 0

20-unix域套接字地址结构

1. unix域协议 看到这个标题,不知道的小伙伴肯定以为这是一个协议族之类的,但实际上unix域协议是在单台主机上客户端与服务端之间的通信方法,简单来说,unix域协议也是一种进程间通信方式,用于同一台主机上的客户端和服务端,为不同的进程间传递描述符。 通常在同一台主机上,使用unix域套接...

2019-01-05 14:00:25

阅读数 149

评论数 0

19-高级I/O函数——套接字和标准I/O

之前我们一直使用的read,write函数以及它们的变体recv, send等函数执行I/O,这些函数都是要使用描述符的,通常这些函数都作为unix内核中的系统调用实现。 除了以上说的系统调用,我们也可以使用标准I/O函数库(standard I/O libary),这个函数库由 ANSI C ...

2019-01-04 17:44:41

阅读数 122

评论数 0

18-UDP的connect函数

1. 面向连接的UDP 在上一篇中遗留了一个问题:sendto函数产生的异步错误一般是不会返回给udp套接字的(主要是因为udp是无连接的原因),如果这个错误要返回给udp套接字,那么就需要调用connect函数。 是的,你没看错,udp也可以调用connect函数达到面向连接,但是这并不...

2018-12-01 12:33:11

阅读数 138

评论数 0

17-sendto函数和异步错误

对于客户端的sendto函数引发的错误,服务端会以一个port unreachable(端口不可达)的ICMP报文消息响应,遗憾的是这个错误并不会返回给客户端,我们称这个错误为异步错误(asyncchronous error),虽然这个错误是由sendto引起的,但是sendto却返回成功,而不是...

2018-11-27 21:26:42

阅读数 202

评论数 0

16-基于udp的客户端/服务端通信

1. 使用udp协议通信 在此之前,我们基于TCP的客户端/服务端通信示例是有连接方式的,客户端会先调用connect发起连接,当两端tcp连接建立完成,然后服务端调用accept接受客户端的连接,通过套接字开始通信。 UDP协议是无连接不可靠的,没有被动套接字和主动套接字之分,客户端和服务端...

2018-10-22 11:15:11

阅读数 250

评论数 0

15-SO_RCVBUF和SO_SNDBUF套接字选项

1. 套接字缓冲区 对于tcp协议来说,客户端和服务端在建立tcp连接的时候,双方会通告自己的接收窗口大小(告诉对方自己能接收的数据大小),然后双方就会根据接收窗口来调整自己的发送窗口大小。 如果你已经忘的差不多了,请参考: 19-tcp连接建立 , 如果你完全看不明白请参考:tcp/ip协议...

2018-10-14 00:12:36

阅读数 201

评论数 0

14-改写tcp服务器

1. 使用select改写tcp服务器 在此之前,回顾一下多进程并发型服务器通信过程,并发型服务器的做法是针对每一个客户端请求,服务器的父进程就fork创建一个子进程来处理客户端的请求。如果有大量的客户端请求的话,那么服务器也需要创建大量的子进程来处理请求,这将会消耗服务器大量的系统资源。  ...

2018-10-13 16:05:57

阅读数 122

评论数 0

13-select重写客户端和tcp优雅关闭

在阅读此篇之前,请先看完第11篇的一小节,传送门:11-服务端进程终止和SIGPIPE信号 1. 服务器进程终止的问题 在第11篇中的第1小节中,tcp客户端需要同时处理两个输入:标准输入和tcp套接字,tcp客户端代码如下所示: //循环读写数据 while (1) { ...

2018-10-09 22:19:53

阅读数 284

评论数 0

12-服务器的几种异常

  一般服务器的几种异常分别为:服务器主机崩溃、服务器主机崩溃后重启、服务器主机关机。 1. 服务器主机崩溃   所谓服务器崩溃就是服务器挂了,导致网络断开,那么当服务器崩溃时会发生什么?   为了模拟这种情况我们需要在不同机器上启动服务器和客户端,先启动服务器,再启动客户端,在客户端输...

2018-09-16 20:46:42

阅读数 607

评论数 0

11-服务端进程终止和SIGPIPE信号

  这一篇我们将讨论服务器进程终止的问题。   先启动服务端,再启动客户端,然后杀死服务端子进程,以此来模拟服务器进程终止的情况。然后客户端再向服务端发送数据,这将会发生什么情况? 服务器程序: #include &...

2018-09-15 20:23:04

阅读数 161

评论数 0

10-在accept之前中止连接(连接异常)

  前面我们已经从基于TCP的客户端/服务端通信示例中了解了整个网络通信流程,现在假设这么一种情况,当客户端和服务端完成三次握手建立连接后,客户端tcp在服务端调用accept之前,马上又发送了一个RST中止连接,这将会发生什么?   如上图所示,为了模拟这种出错情况需要在服务端调用acce...

2018-09-14 22:21:28

阅读数 389

评论数 0

9-调用connect连接超时

  简单来说,连接超时就是当客户端调用connect函数跟服务端建立连接,等待一段时间后,最后connect函数返回ETIMEDOUT错误,建立连接失败。那么连接超时具体是怎么出现的呢?一般是客户端调用connect发送的SYN报文在网络传输过程中发生网络拥塞,导致报文丢失或服务端收到SYN,但未...

2018-09-14 21:19:34

阅读数 268

评论数 0

8-多进程并发型服务器

1. 多进程并发服务器   前面的学习中都是一个服务器处理一个客户端的连接请求,当处理完这个客户端时才会去处理下一个客户端的请求,这种服务器我们称之为迭代型服务器。   假如现在有多个客户端去请求访问一个服务器,会导致这个服务器的处理速度变得很慢不说,后面还有很多客户端正在等待处理请求,这时服...

2018-09-08 18:20:29

阅读数 90

评论数 0

7-客户端/服务端程序中TIME_WAIT状态

  现在我们基于上一篇的客户端和服务端程序做一个TIME_WAIT状态的测试(关于TIME_WAIT状态可以参考这篇文章:23-tcp协议——TIME_WAIT状态和FIN_WAIT2状态),修改客户端和服务端的部分代码。 客户端程序: #include &...

2018-09-04 20:55:59

阅读数 391

评论数 0

6-基于TCP的客户端/服务端通信

  在前面的学习中,我们学习了客户端和服务端进行网络通信的函数接口,下面这张图就是基于tcp协议的客户端和服务端之间的通信流程,相信你应该不陌生了。...

2018-09-01 20:31:26

阅读数 318

评论数 0

5-accept接受连接

1. accept函数   服务器可以调用accept函数接受连接,从未决连接队列的队头取出一个连接,同时由内核自动创建一个全新的socket 文件描述符并返回。通信的关键在于服务器进程通过内核自动创建的新socket和客户端的socket进行网络通信,换句话说,服务端和客户端进行通信使用的其实...

2018-06-14 21:46:51

阅读数 211

评论数 0

3-listen函数(主动socket和被动socket)

1. 主动socket和被动socket   一般来说,使用socket函数创建的socket默认是主动socket,这意味着一个主动的socket可以调用connect跟一个被动socket建立一个连接,对主动socket来说,这叫主动打开。   被动socket是一个通过调用listen函...

2018-06-12 14:54:35

阅读数 658

评论数 1

2-创建并绑定“插座”

1. 网络通信的套接字   在学习linux编程时,我们知道套接字socket也是一种文件,用于进程间网络通信的文件类型,本质是内核创建的缓冲区。既然是文件,那么我们可以使用文件描述符引用套接字。与管道类似的,区别在于管道主要应用于本地进程间通信,套接字一般应用于网络进程间数据的通信,即通过网络...

2018-06-12 14:44:47

阅读数 120

评论数 0

提示
确定要删除当前文章?
取消 删除
关闭
关闭