![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
TCP/IP网络编程,尹圣雨
文章平均质量分 78
vancounver
这个作者很懒,什么都没留下…
展开
-
17.1 优于select的epoll
1. 实现IO复用的传统方法select和poll,但是性能不满意,因此有Linux的epoll,BSD的kqueue,Solaris的/dev/poll,Windows的IOCP。如,select不适合以web服务器端开发为主流的现代开发环境。a. 调用select后常见的针对所有文件描述符的循环语句;b. 每次调用select函数时都需要向函数传递监视对象信息。 —— 致命弱点原创 2017-02-04 15:07:56 · 245 阅读 · 0 评论 -
8.1 域名及网络地址
1. DNS (Domain Name System)是对IP地址和域名进行相互转换的系统,核心是DNS服务器。所有计算机都记录着默认DNS服务器地址,通过这个DNS服务器得到相应域名的IP地址信息。一般服务器域名不会轻易改变,但会相对频繁地改变服务器IP地址。可以通过ping www.baidu.com 查看对应的IP地址。也可以通过nslookup命令查看计算机中注册的默认DNS服原创 2017-02-02 21:03:03 · 260 阅读 · 0 评论 -
9.2 SO_REUSEADDR配置 & TCP_NODELAY
1. time-wait:先断开连接FIN的主机有个时间间隙,在该间隙中端口号被占用,bind时会出错。在time-wait状态可以继续接收主机B的终止信息,假如没有这个机制,A发送ACK时终止,但是ACK丢失了,则B永远无法接收A的ACK。系统SOL_SOCKET中的SO_REUSEADDR,默认是FALSE,即time-wait内端口不能重复使用。将值改成TRUE,即可重新使用。原创 2017-02-03 10:26:01 · 499 阅读 · 0 评论 -
10.1 多进程服务器端
1. 并发服务器端实现模型和方法:a. 多进程服务器:通过创建多个进程提供服务b. 多路复用服务器:通过捆绑并统一管理IO对象提供服务c. 多线程服务器:通过生成与客户端等量的线程提供服务2. 通过fork函数创建进程:复制正在运行的调用fork函数的进程,复制相同的内存空间。两个进程都执行fork函数以后的语句。#include pid_t fork(void);原创 2017-02-03 11:00:46 · 234 阅读 · 0 评论 -
10.2 信号处理
1. 在多进程间通信中已经描述信号通信,这边重复一遍。#include void (*signal(int signo,void (*func)(int)))(int);返回之前注册的函数指针。sigaction函数类似于signal函数,完全可以替代后者,也更加稳定。#include int sigaction(int signo,const struct sigac原创 2017-02-03 12:46:22 · 216 阅读 · 0 评论 -
10.3 基于多任务的并发服务器
1.基于进程的并发服务器模型a. 父进程通过调用accept受理连接请求;b. 获取套接字文件描述符创建并传递给子进程;//子进程复制父进程的所有资源c. 子进程利用传递来的文件描述符提供服务。2. 实现#include #include #include #include #include #include #include原创 2017-02-03 13:49:06 · 360 阅读 · 0 评论 -
10.4 分割TCP 的IO程序
1. 分割IO程序:将接收数据,发送数据的进程分开,使程序的实现变得更加简单2. 分割IO的实现模型代码:#include #include #include #include #include #include #define BUF_SIZE 30 void error_handling(char *me原创 2017-02-03 14:46:11 · 279 阅读 · 0 评论 -
12 IO复用服务器模型
1. IO复用模型与多进程模型对比:a. 多进程模型:需要大量的运算和内存空间,进程间数据交换复杂IPC。b. IO复用模型可以不创建多进程同时又向多个客户端提供服务,但是并不适用于所有情况。2. select函数,将多个文件描述符集中在一起统一监视。监视项目有:是否存在套接字接收数据;无需阻塞传输数据的套接字有哪些;哪些套接字发生异常;3. 设置文件描述符FD原创 2017-02-03 15:24:32 · 291 阅读 · 0 评论 -
13 多种IO函数
1. send函数#include ssize_t send(int sockfd,const void *buf,size_t nbytes, int flags);成功时返回发送的字节数,失败-1sockfd:数据传输对象的套接字文件描述符buf:保存数据的缓冲地址值nbytes:待传输的字节数flags:传输数据时指定的可选项2. recv函数#include原创 2017-02-03 16:48:11 · 310 阅读 · 0 评论 -
15.1 多播
1. 多播,同时向多个主机传递数据a. 多播服务器针对特定多播组,只发送一次数据;b. 虽只发送一次数据,但是该组内的所有客户端都会接收数据;c. 多播组数可以在IP地址范围内任意增加;d. 加入特定组即可接收发送该多播组的数据。多播是基于MBone这个虚拟网络工作的,它是以物理网络为基础,通过软件方法实现的多播通信必备虚拟网络。多播组是D类IP地址,224.0.0.0-2原创 2017-02-03 17:10:52 · 215 阅读 · 0 评论 -
15.2 广播
1. 多播即使在跨越不同网络的情况下,只要加入多播组就能接收数据。广播只能向同一网络中的主机传输数据。与多播相同,广播也是基于UDP完成的。根据传输数据时使用的IP地址形式,广播分成2种:直接广播和本地广播直接广播的IP地址中除了网络地址外,其余主机地址全部设置成1。如向192.12.34中的所有主机传送数据,使用地址为192.12.34.255.本地广播使用的IP地址限定为255.2原创 2017-02-03 19:57:17 · 141 阅读 · 0 评论 -
15 套接字和标准IO
1. 套接字数据通信中使用标准IO函数:a. 具有良好的移植性portability;//所有标准函数都具有良好的移植性b. 标准IO可以利用缓冲提高性能;2. 使用标准IO的几个缺陷a. 不容易进行双向通信;//同时读写方式打开r+,w+,a+b. 有时候可能频繁调用fflush;//每次切换读写都应该调用fflushc. 需要以FILE结构体指针形式原创 2017-02-04 10:36:55 · 208 阅读 · 0 评论 -
7.1 优雅断开套接字
1. 使用close,closesocket函数是单方面断开连接,不够优雅。调用了close意味着完全断开连接,不能发送也不能接收数据。图中,A发送完数据后断开连接,之后主机再也不发接收B的数据,如此不够优雅。2. 使用shutdown可以关闭其中的一个流。#include int shutdown(int sock, int howto); 成功返回0,失败返回-1原创 2017-02-02 20:08:59 · 239 阅读 · 0 评论 -
6.3 Connected UDP & unconnected UDP
1. 在UDP中,使用sendto数据传输过程分三阶段:a. 向UDP套接字注册目标IP和端口号;b. 传输数据;c. 删除UDP套接字中注册的目标地址信息。2. unconnected UDP套接字:每次调用sendto重复1的三个步骤,每次都变更目标地址,因此可以重复利用同一UDP向不同目标传递数据。注册了目标地址的UDP套接字是connected UDP,默认情况下是un原创 2017-02-02 19:26:12 · 488 阅读 · 0 评论 -
6.2 UDP 原理2
1. UDP客户端套接字的地址分配UDP程序中, 调用sendto函数传输数据前完成套接字地址分配工作。可以调用bind函数,bind函数不区分是TCP还是UDP。如果调用sendto函数时发现尚未分配地址,则首次调用sendto时自动分配IP和端口,并且分配的地址移植保留到程序结束。2. UDP存在数据边界与TCP不一样,UDP协议中,调用IO函数的次数很重要,输入函原创 2017-01-24 16:44:53 · 235 阅读 · 0 评论 -
17.2 边缘触发和条件触发
1. 两者区别:在于发生事件的时间点,条件触发:只要输入缓冲有数据就一直通知该事件;边缘触发:输入缓冲受到数据时仅注册一次事件。epoll默认以条件触发方式工作,select也是以条件触发模式工作的。2. 条件触发事件特性:#include #include #include #include #include #include #inclu原创 2017-02-04 21:02:58 · 542 阅读 · 0 评论 -
18.1 多线程服务器端的实现1 —— 线程概念
1. Web服务器的发展迫使UNIX系列操作系统开始重视线程,Web服务器进程需要向多个客户端提供服务,因此逐渐舍弃进程,而用效率更高的线程。2. 多进程模型的缺点:a. 创建进程的过程需要大的开销;b. 进程间通信需要用到IPC技术;c. 经常发生“上下文切换Context Switching”,时间很长,很致命:进程A切换到进程B时,要将进程A信息移出内存,并读入进程B信息。原创 2017-02-06 15:07:09 · 271 阅读 · 0 评论 -
18.2 多线程服务器端的实现2
1. 线程同步a. 需要线程同步的情况:1)同时访问同一内存空间;2)需要指定访问同一内存空间的线程执行顺序。b. 同步技术:互斥量Mutex和信号量Semaphore将临界区比喻成洗手间,线程同步理解成一把锁。为了保护个人隐私,进洗手间时锁上门,出来再打开;如果有人使用洗手间,其他人需要在外面等待;等待的人数可能很多,这些人需要排队进入洗手间。2. 互原创 2017-02-06 21:15:46 · 411 阅读 · 0 评论 -
1.1 理解网络编程和套接字
最近在看网络编程相关的知识,网上说尹圣雨的《TCPIP网络编程》不错,遂网上找了分电子版本的书籍,记录下阅读笔记。TCP套接字通信可以类比电话机,接听方流程如下:socket —— 安装电话机bind —— 分配电话号码listen —— 连接电话线accept —— 拿起话筒打电话端比较简单,只需要:socketconnect举例:服务器端收原创 2017-01-17 16:23:53 · 388 阅读 · 0 评论 -
25 总结
1. 尹圣雨的TCPIP网络编程一书算是看完了,中间的windows部分跳过了,只看了linux相关内容。2. 文章的最后一章作了个总结:a. 一是说明书中的内容远远不足,适合入门学者,如需深入研究网络编程,需要兴趣驱使,查阅更多数据,了解更多知识;b. 网络编程与操作系统息息相关,也需要了解系统编程。c. 推荐了很多网络编程相关书籍:《APUE第二版》,之前看了第三版。两种看原创 2017-02-08 21:57:37 · 245 阅读 · 0 评论 -
4.1 TCP的服务器端/客户端1
一、 理解下TCP和UDP根据数据传输方式的不同,基于网络协议的套接字一般分成TCP套接字和UDP套接字。TCP套接字是面向连接的,又称为基于流Stream的套接字,TCP(Transmission Control Protocol 传输控制协议)的简写,书中将TCP/IP协议栈分成4层架构,掌握这4层协议栈就足够了。另外不同于OSI 7层架构:物理层-->数据链路层-->网络层-->传输原创 2017-01-18 08:32:58 · 383 阅读 · 0 评论 -
24 实现http服务器端
1. HTTP:Hypertext Transfer Protocol超文本传输协议。超文本是可以根据客户端请求而跳转的结构化信息。HTTP协议是以超文本传输为目的而设计的应用层协议,是基于TCP/IP实现的协议,实现该协议就相当于实现了Web服务器端。2. Http协议又称为无状态的stateless协议从下图中可以看出服务器端响应客户端请求后立即断开,不会维持连接状态。即使原创 2017-02-08 16:44:07 · 409 阅读 · 0 评论 -
5.1 基于TCP的服务器端和客户端2
4.1的Client代码中, 在传输的数据较大时就会出现问题。服务器端不需要修改,client进行改进:#include #include #include #include #include #include #define BUF_SIZE 1024void error_handling(char *message);int main(int argc,char *原创 2017-01-19 12:47:19 · 221 阅读 · 0 评论 -
5.2 计算器服务器端/客户端示例
通信过程中一般都需要提前定义好通信协议,TCP中亦是如此。我们编写计算器的例子,定义好应用层协议: 1.客户端连接到服务器端后以1字节整数形式传递待算数字个数; 2.客户端向服务器端传递的每个整数型数据占用4字节; 3.传递完数据后,接着1个字节运算符; 4.选择字符+,-,*,/; 5.服务器以4字节整数型向客户端传回运算结果; 6原创 2017-01-19 13:13:08 · 1285 阅读 · 0 评论 -
5.3 TCP原理
1. TCP套接字中的IO缓冲 IO缓冲在每个TCP套接字中单独存在; IO缓冲在创建套接字时自动生成; 即使关闭套接字也会继续传递输出缓冲中的遗留数据; 关闭套机子将丢失输入缓冲中的数据。假如客户端输入缓冲只有50字节,而服务器端传输了100字节,会有这问题吗?不会,TCP套接字的数据收发是没有边界的,不会发送类似问题。TCP有滑动窗口协议,数据收原创 2017-01-19 14:50:47 · 263 阅读 · 0 评论 -
6.1 基于UDP的服务器端/客户端
1.UDP套接字原理 UDP的工作原理可以类比于信件:寄件前先写上寄件人和收件人地址,之后贴上邮票放入邮筒。我们无法确认对方是否收到,邮寄过程中也有可能丢失信件。信件是一种不可靠的传输方式。 TCP类比于打电话, UDP类比于信件,只是从工作方式进行类比。但是速率上,TCP无法超越UDP,只能接近。应用中可以这样,传递压缩文件需要使用TCP,使数据接收可靠;如果是视频、语音等,丢失一两原创 2017-01-20 16:10:02 · 307 阅读 · 0 评论 -
16 IO分离的其他说明
1. IO流分离方式:a. 第十章TCP IO routine分离,通过fork文件描述符区分输入输出,虽然文件描述符不会根据输入、输出进行区分,但是分开了两个文件描述符的用途;b. 第十五章 调用fdopen创建FILE指针,分离输入工具和输出工具。2. 分离流的好处://第十章a. 通过分开输入过程和输出过程降低实现难度;b. 与输入无关的输出操作可以提高速度;原创 2017-02-04 12:05:52 · 329 阅读 · 0 评论