再读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,如需转载请自行联系原作者

目录
相关文章
|
1月前
|
编解码 安全 Linux
网络空间安全之一个WH的超前沿全栈技术深入学习之路(10-2):保姆级别教会你如何搭建白帽黑客渗透测试系统环境Kali——Liinux-Debian:就怕你学成黑客啦!)作者——LJS
保姆级别教会你如何搭建白帽黑客渗透测试系统环境Kali以及常见的报错及对应解决方案、常用Kali功能简便化以及详解如何具体实现
|
1月前
|
安全 网络协议 算法
网络空间安全之一个WH的超前沿全栈技术深入学习之路(8-1):主动信息收集之ping、Nmap 就怕你学成黑客啦!
网络空间安全之一个WH的超前沿全栈技术深入学习之路(8-1):主动信息收集之ping、Nmap 就怕你学成黑客啦!
|
1月前
|
网络协议 安全 NoSQL
网络空间安全之一个WH的超前沿全栈技术深入学习之路(8-2):scapy 定制 ARP 协议 、使用 nmap 进行僵尸扫描-实战演练、就怕你学成黑客啦!
scapy 定制 ARP 协议 、使用 nmap 进行僵尸扫描-实战演练等具体操作详解步骤;精典图示举例说明、注意点及常见报错问题所对应的解决方法IKUN和I原们你这要是学不会我直接退出江湖;好吧!!!
网络空间安全之一个WH的超前沿全栈技术深入学习之路(8-2):scapy 定制 ARP 协议 、使用 nmap 进行僵尸扫描-实战演练、就怕你学成黑客啦!
|
1月前
|
网络协议 安全 算法
网络空间安全之一个WH的超前沿全栈技术深入学习之路(9):WireShark 简介和抓包原理及实战过程一条龙全线分析——就怕你学成黑客啦!
实战:WireShark 抓包及快速定位数据包技巧、使用 WireShark 对常用协议抓包并分析原理 、WireShark 抓包解决服务器被黑上不了网等具体操作详解步骤;精典图示举例说明、注意点及常见报错问题所对应的解决方法IKUN和I原们你这要是学不会我直接退出江湖;好吧!!!
网络空间安全之一个WH的超前沿全栈技术深入学习之路(9):WireShark 简介和抓包原理及实战过程一条龙全线分析——就怕你学成黑客啦!
|
1月前
|
Kubernetes 网络协议 Python
Python网络编程:从Socket到Web应用
在信息时代,网络编程是软件开发的重要组成部分。Python作为多用途编程语言,提供了从Socket编程到Web应用开发的强大支持。本文将从基础的Socket编程入手,逐步深入到复杂的Web应用开发,涵盖Flask、Django等框架的应用,以及异步Web编程和微服务架构。通过本文,读者将全面了解Python在网络编程领域的应用。
31 1
|
2月前
|
Java
[Java]Socket套接字(网络编程入门)
本文介绍了基于Java Socket实现的一对一和多对多聊天模式。一对一模式通过Server和Client类实现简单的消息收发;多对多模式则通过Server类维护客户端集合,并使用多线程实现实时消息广播。文章旨在帮助读者理解Socket的基本原理和应用。
29 1
|
2月前
|
消息中间件 监控 网络协议
Python中的Socket魔法:如何利用socket模块构建强大的网络通信
本文介绍了Python的`socket`模块,讲解了其基本概念、语法和使用方法。通过简单的TCP服务器和客户端示例,展示了如何创建、绑定、监听、接受连接及发送/接收数据。进一步探讨了多用户聊天室的实现,并介绍了非阻塞IO和多路复用技术以提高并发处理能力。最后,讨论了`socket`模块在现代网络编程中的应用及其与其他通信方式的关系。
151 3
|
2月前
|
网络协议 Linux 应用服务中间件
Socket通信之网络协议基本原理
【10月更文挑战第10天】网络协议定义了机器间通信的标准格式,确保信息准确无损地传输。主要分为两种模型:OSI七层模型与TCP/IP模型。
|
2月前
|
存储 安全 网络安全
浅谈网络安全的认识与学习规划
浅谈网络安全的认识与学习规划
38 6