再读Socket编程——《UNIX网络编程(卷一)》学习点滴

简介:

  原先曾以Socket编程为入口开始自己的新的学习,毕竟未曾致用,时至今日已比较生疏。借着阅读《UNIX网络编程(卷一)》(简称UNPv1)的机会,正好复习一番,而且希望将新的感受记录下来。一些技术细节翻阅原书即可,点到为止,不在这篇博文详述。

 

  作者推荐在网络编程中使用snprintf()代替sprintf()、用fget()、strncat()和strncpy()分别代替gets()、strcat()和strcpy();同时提到了更好的替代函数strlcat()和strlcpy()。具体原因是前者的调用会使缓冲区溢出,而这是黑客网络入侵的一种方式。snprintf()需要缓冲区长度作为显式参数,超过缓冲区尾端的字符都将被抛弃。其余函数情形类似。

        ----第1章 简介,1.5 一个简单的时间获取服务器程序

 

  再看TCP状态转换图,发现以前忽略了一些细节:除了三路握手、关闭连接的一些典型状态,还有由于双方同时发送SYN造成的同时打开;同时发送FIN造成的同时关闭;以及TIME_WAIT状态存在的理由:最后的ACK可能丢失,使这次连接老的分组自然消逝。

        ----第2章  传输层:TCP、UDP和SCTP,2.6 TCP连接的建立和终止

  SCTP是相对而言比较新的协议,同时以前从未接触过。面向连接按序递送的消息、所连接端点之间多个流、单个端点支持多个IP 地址是目前所了解的SCTP的特征,四路握手、拆连亦与TCP不同。

        ----第2章  传输层:TCP、UDP和SCTP,2.8 SCTP关联的建立和终止

  虽然和TCP一样都有应用进程缓冲区(TCP可以是任意大小),但UDP的套接字发送缓冲区实际上是不存在的,通常过程是把应用进程缓冲区内容复制到某一个内核缓冲区,发送后即丢弃。

        ----第2章  传输层:TCP、UDP和SCTP,2.11 缓冲区大小及限制

 

  关于开发包裹函数readn()、writen()的必要性在于,不同于文件读写,使用read()和write()时,内核提供的套节字缓冲区在某个时刻可能不足以放下所应输入或输出的n个字符,这时便要重复调用read()或write()以达到目的,在未结束前完成n个字符的输入或输出。

        ----第3章  套接字编程简介,3.9 readn、writen和readline函数

 

  listen()的第二个参数backlog涉及到内核对于监听套接字维护的两个队列的机制。这两个队列存放的是ESTABLISHED和SYN_RCVD状态的排队的套接字之和,最初的设计是,这个和等于backlog。然而目前的实现并不明确,而且在不同的UNIX实现中,实际已排队连接的最大数目一般比backlog稍大一些。顺便提一下,在对这两个队列有所了解之后,就不难明白accept()如何获取一个ESTABLISHED的连接并赋予它一个套接字结构的了。

        ----第4章  基本TCP套接字编程,4.5 listen函数

 

  select()中间的三个参数readset、writeset和exceptest会在返回时把代表某一位就绪的描述符置为1,未就绪置为0,因此每次调用select()时应该先把关心的位置为1。

        ----第6章  I/O复用:select和poll函数,6.3 select函数      

 

  对于线程私有数据相关机制和使用,UNP比APUE介绍的要全面一些。每个进程都有一个key结构,它由系统维护,存放某个索引号的线程私有数据是否在被使用的标志和析构函数,而私有数据本身由存放某一个线程信息的Thread中对应的指针访问(这是笔者在阅读了P543至544相关内容后自己的理解)。相关函数的使用方法比较典型,记录在下面。my_read和readline的关系是,readline调用my_read,先读入需要的全部数据进入自己的缓冲区,每次返回一个,循环至readline通过调用读取完毕。

使用线程私有数据的readline函数

        ----第26章 线程,26.5 线程特定数据

 

  编写SCTP程序需要注意几个地方:开启内核支持(2.4及以下不支持)、安装运行库、编译时需要-lsctp选项。

  tcp_connect()利用getaddrinfo()屏蔽了很多细节操作,屏蔽了IPv4和IPv6在填充地址结构的差别,确实很有价值。

(549~560涉及到非阻塞I/O,未读)

 

  目前手上有其他工作要做,UNP的第三部分高级套接字编程就不再精读,全书作为以后查阅时参考的手册。




本文转自五岳博客园博客,原文链接:www.cnblogs.com/wuyuegb2312/archive/2012/06/19/2446058.html,如需转载请自行联系原作者

目录
相关文章
|
18天前
|
开发者 Python
Python Socket编程:不只是基础,更有进阶秘籍,让你的网络应用飞起来!
在数字时代,网络应用成为连接世界的桥梁。Python凭借简洁的语法和丰富的库支持,成为开发高效网络应用的首选。本文通过实时聊天室案例,介绍Python Socket编程的基础与进阶技巧。基础篇涵盖服务器和客户端的建立与数据交换;进阶篇则探讨多线程与异步IO优化方案,助力提升应用性能。通过本案例,你将掌握Socket编程的核心技能,推动网络应用飞得更高、更远。
32 1
|
1月前
|
监控 网络协议 Linux
网络学习
网络学习
132 68
|
6天前
|
网络协议 网络架构
网络协议介绍与学习
网络协议介绍与学习
20 4
|
6天前
|
网络协议 网络安全 数据安全/隐私保护
网络基础知识学习
如果你打算深入学习网络技术,建议从上述基础知识入手,并逐渐扩展到更高级的主题,如网络编程、网络安全、网络管理等。同时,实践是学习网络技术的关键,可以通过搭建自己的小型网络环境来进行实验和探索。
10 2
|
14天前
|
网络协议 Python
网络世界的建筑师:Python Socket编程基础与进阶,构建你的网络帝国!
在数字宇宙中,网络如同复杂脉络连接每个角落,Python Socket编程则是开启这一世界的钥匙。本文将引导你从基础概念入手,逐步掌握Socket编程,并通过实战示例构建TCP/UDP服务器与客户端。你将学会使用Python的socket模块进行网络通信,了解TCP与UDP的区别,并运用多线程与异步IO提升服务器性能。跟随本文指引,成为网络世界的建筑师,构建自己的网络帝国。
26 2
|
15天前
|
网络协议 Python
告别网络编程迷雾!Python Socket编程基础与实战,让你秒变网络达人!
在网络编程的世界里,Socket编程是连接数据与服务的关键桥梁。对于初学者,这往往是最棘手的部分。本文将用Python带你轻松入门Socket编程,从创建TCP服务器与客户端的基础搭建,到处理并发连接的实战技巧,逐步揭开网络编程的神秘面纱。通过具体的代码示例,我们将掌握Socket的基本概念与操作,让你成为网络编程的高手。无论是简单的数据传输还是复杂的并发处理,Python都能助你一臂之力。希望这篇文章成为你网络编程旅程的良好开端。
37 3
|
1月前
|
网络协议 安全 网络安全
网络基础知识学习
【9月更文挑战第1天】
47 0
|
2月前
|
前端开发 算法 网络协议
如何学习计算机基础知识,打好前端和网络安全的基础
如何学习计算机基础知识,打好前端和网络安全的基础
38 4
|
2月前
|
分布式计算 网络协议 Python
Python网络编程:socket编程
Socket 编程是网络编程的重要部分,主要用于在不同计算机之间进行通信。Python 提供了一个非常强大的 socket 库,使得网络编程变得简单和灵活。本篇博文将详细介绍 Python 的 socket 编程,包括基础概念、核心组件、常用功能,并附上一个综合的示例及其运行结果。
|
2月前
|
网络协议
详解VXLAN网络中报文是如何转发的?值得收藏学习!
详解VXLAN网络中报文是如何转发的?值得收藏学习!
详解VXLAN网络中报文是如何转发的?值得收藏学习!
下一篇
无影云桌面