
UNP编程
文章平均质量分 95
Unix网络编程
董哥的黑板报
90后程序员!
展开
-
UNP编程:01---套接字地址结构体:sockaddr_in、sockaddr_in6、sockaddr_storage、INADDR_ANY、in6aadr_any
一、IPv4套接字地址结构(struct sockaddr_in)#include<netinet/in.h>struct in_addr{ in_addr_t s_addr; /*32-bit IPv4 address*/ /*network byte ordered*/};s...原创 2019-04-08 21:15:10 · 2806 阅读 · 1 评论 -
UNP编程:02---主机字节序、网络字节序(htons、htonl、ntohs、ntohl)
一、主机字节序、网络字节序主机字节序:数值的存储采用小端法存储。数值低位存储在内存的低地址,数值高位存储在内存的高地址 网络字节序:数值的存储采用大端法存储。数值高位存储在内存的低地址,数值低位存储在内存的高地址例如:有一个整型0x12345678(4字节)。左侧为主机字节序,右侧为网络字节序二、字节序的转换主机字节序转换为网络字节序:#include <arpa...原创 2019-04-08 21:37:01 · 718 阅读 · 0 评论 -
UNP编程:03---本地IP与网络IP转换(inet_aton、inet_addr、inet_ntoa、inet_pton、inet_ntop)
一、inet_aton、inet_addr、inet_ntoa这三个函数只适用于IPv4地址①点分十进制IP字符串-->网络字节序的二进制IP#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>int inet_aton(const char *cp,...原创 2019-04-08 22:20:13 · 977 阅读 · 0 评论 -
UNP编程:04---socket、bind、connect、listen、accept、close
一、socket()函数#include<sys/types.h>#include<sys/socket.h>int socket(intprotofamily, inttype, intprotocol);参数参数1:即协议域,又称为协议族(family) 域参数指定通信域;这将选择用于通信的协议系列。这些族在<sys/socket....原创 2019-04-10 13:42:40 · 1735 阅读 · 0 评论 -
UNP编程:05---地址获取函数(getsockname、getpeername)
这两个函数与域名(第9章)没有任何联系 一、概念#include<sys/socket.h>int getsockname(int sockfd,struct sockaddr *localaddr,socklen_t *addrlen);int getperrname(int sockfd,struct sockaddr *perraddr,socklen_t *a...原创 2019-04-10 15:04:24 · 1337 阅读 · 0 评论 -
UNP编程:06---TCP之(三次握手与四次挥手、TCP状态转换图与分组交换)
一、TCP建立:三次握手①客户通过调用connect发起主动打开(active open)。这导致客户TCP发送一个SYN(同 步)分节,它告诉服务器客户将在(待建立的)连接中发送的数据的初始序列号。通常SYN分节不携带数据,其所在IP数据报只含有一个IP首部、一个TCP首部及可能有的TCP选项 ②服务器必须确认(ACK)客户的SYN,同时自己也得发送一个SYN分节,它含有服务器将在同一连接...原创 2019-11-03 14:26:06 · 697 阅读 · 0 评论 -
UNP编程:07---TCP之(TCP缓冲区)
每一个TCP套接字有一个发送缓冲区,我们可以使用SO_SNDBUF套接字选项来更改该缓冲 区的大小 当某个应用进程调用write时,内核从该应用进程的缓冲区中复制所有数据到所写套接字的发送缓冲区。如果该套接字的发送缓冲区容不下该应用进程的所有数据(或 是应用进程的缓冲区大于套接字的发送缓冲区,或是套接字的发送缓冲区中已有其他数据),该应用进程将被投入睡眠。这里假设该套接字是阻塞的,它是通常的...原创 2019-11-03 14:45:49 · 692 阅读 · 1 评论 -
UNP编程:08---TCP之(并发服务器模型:fork、exec)
一、frok与exec父进程中调用fork之前打开的所有描述符在fork返回之后由子进程分享。我们将看到网络服务器利用了这个特性:父进程调用accept之后调用fork。所接受的已连接套接字随后就在父 进程与子进程之间共享。通常情况下,子进程接着读写这个已连接套接字,父进程则关闭这个已连接套接字fork的两个典型用法①一个进程创建一个自身的副本,这样每个副本都可以在另一个副本执行其他任...原创 2019-04-26 10:15:21 · 1083 阅读 · 0 评论 -
UNP编程:09---TCP之(SIGCHLD信号处理:僵死进程)
SIGCHLD信号介绍见见文章:https://blog.youkuaiyun.com/qq_41453285/article/details/89217003一、僵死进程设置僵死(zombie)状态的目的是维护子进程的信息,以便父进程在以后某个时候获取。 这些信息包括子进程的进程ID、终止状态以及资源利用信息(CPU时间、内存使用量等等) 如果一个进程终止,而该进程有子进程处于僵死状态,那么它的所有...原创 2019-04-26 10:16:27 · 768 阅读 · 0 评论 -
UNP编程:10---TCP之(子进程终止处理:wait、waitpid)
一、wait、waitpid函数这两个函数的用法可以见文章:https://blog.youkuaiyun.com/qq_41453285/article/details/88992605函数返回值利用函数wait和waitpid均返回两个值:已终止子进程的进程ID号,以及通过statloc指针返回 的子进程终止状态(一个整数) 我们可以调用三个宏来检查终止状态,并辨别子进程是正常终 止、由某个...原创 2019-04-26 10:17:46 · 809 阅读 · 0 评论 -
UNP编程:11---TCP之(accept返回前连接终止)
前面文章介绍的被中断系统调用的例子,另有一种情形也能够导致accept返回一个非致命的错误,在这种情况下,只需要再次调用accept。图5-13中所示的分组序列在较忙的服 务器(典型的是较忙的Web服务器)上已出现过图示三路握手完成从而连接建立之后,客户TCP却发送了一个RST(复位)。在服务器端看来,就在该连接已由TCP排队,等着服务器进程调用accept的时候RST到达。稍后,服务器进...原创 2019-04-26 10:20:47 · 766 阅读 · 0 评论 -
UNP编程:12---TCP之(SIGPIPE信号处理)
待续原创 2019-05-07 13:06:13 · 526 阅读 · 0 评论 -
UNP编程:13---TCP之(服务器主机的崩溃与重启)
待续原创 2019-05-07 13:07:17 · 541 阅读 · 0 评论 -
UNP编程:15---UDP之(recvfrom、sendto函数)
一、格式#include<sys/types.h>#include<sys/socket.h>ssize_t recvfrom(int sockfd, void *buf, size_t nbytes, int flags,struct sockaddr *from, socklen_t *addrlen);ssize_t sendto(int soc...原创 2019-04-27 11:28:19 · 2083 阅读 · 0 评论 -
UNP编程:16---UDP之(UDP套接字的数据缓冲区与数据丢失)
一、UDP套接字的数据接收缓冲区事实上每个UDP套接字都有一个接收缓冲区, 到达该套接字的每个数据报都进入这个套接字接收缓冲区。当进程调用recvfrom时,缓冲区中 的下一个数据报以FIFO(先入先出)顺序返回给进程。这样,在进程能够读该套接字中任何已 排好队的数据报之前,如果有多个数据报到达该套接字,那么相继到达的数据报仅仅加到该套 接字的接收缓冲区中。然而这个缓冲区的大小是有限的。我们已...原创 2019-04-27 11:38:23 · 1528 阅读 · 0 评论 -
UNP编程:17---UDP之(验证接收到的消息的源地址、获取自己的地址/端口)
一、引入在前面介绍的dg_cli函数的结尾我们提到,知道客户临时端口号的任何进程都可往客户发送数据报,而且这些 数据报会与正常的服务器应答混杂。我们的解决办法是修改dg_cli函数的recvfrom调用以返回数据报发送者的IP地址和端口号,保留来自数据报所发往服务器的应答,而忽略任何其他数据报。 然而这样做照样存在一些缺陷,我们马上就会看到。二、修改dg_cli函数voiddg_cl...原创 2019-04-28 13:01:07 · 711 阅读 · 0 评论 -
UNP编程:18---UDP之(UDP服务端未运行)
一、运行案例二、异步错误原创 2019-04-28 13:01:30 · 568 阅读 · 0 评论 -
UNP编程:19---UDP之(UDP使用connect函数)
一、UDP使用connect函数二、如果UDP使用了connect函数对于已连接的套接字,与默认的未连接的UDP套接字相比,发生了3个变化三、小结四、DNS服务使用connect函数五、给一个UDP套接字多次调用connect调用多次connect的目的第一个目的:第二个目的:六、使用了connect的效率如果未使...原创 2019-04-28 13:01:41 · 631 阅读 · 0 评论 -
UNP编程:21---套接字选项之(套接字选项简介与接口:getsockopt、setsockopt)
一、套接字选项的设置有很多方法来获取和设置影响套接字的选项:getsockopt和setsockopt函数; fcntl函数 ioctl函数二、getsockopt、setsockopt功能:用于设置/获得套接字选项#include<sys/socket.h>int setsockopt(int sockfd, int level, int optname,co...原创 2019-04-26 10:53:53 · 1268 阅读 · 0 评论 -
UNP编程:22---套接字选项之(通用套接字选项:SOL_SOCKET)
这些选项是协议无关的(也就是说,它们由内核中的协 议无关代码处理,而不是由诸如IPv4之类特殊的协议模块处理),不过其中有些选项只能应用到某些特定类型的套接字中。举例来说,尽管我们称SO_BROADCAST套接字选项是“通用”的,它 却只能应用于数据报套接字一、SO_BROADCAST本选项开启或禁止进程发送广播消息的能力。只有数据报套接字支持广播,并且还必须是在支持广播消息的网络上(例...原创 2019-04-26 11:17:13 · 1821 阅读 · 0 评论 -
UNP编程:23---套接字选项之(IPV4套接字选项:IPPROTO_IP)
这些套接字选项由IPv4处理,它们的级别(即getsockopt和setsockopt函数的第二个参 数)为IPPROTO_IP。我们把其中的多播套接字选项推迟到多播文章中再讨论一、IP_HDRINCL如果本选项是给一个原始IP套接字设置的,那么我们必须为所有在该原始套接字上发送的数据报构造自己的IP首部。一般情况下,在原始套接字上发送的数据报其IP首部是 由内核构造的,不过有些应用程序...原创 2019-04-26 11:52:56 · 1789 阅读 · 0 评论 -
UNP编程:24---套接字选项之(IPV6套接字选项:IPPROTO_IPV6)
这些套接字选项由IPv6处理,它们的级别(即getsockopt和setsockopt函数的第二个参 数)为IPPROTO_IPV6。我们把多播套接字选项推迟到21.6节再讨论。这些选项中有许多用上了 recvmsg函数的辅助数据(ancillary data)参数,我们将在辅助数据文章中讨论它。所有IPv6套接字选项 都定义在RFC 3493[Gilligan et al. 2003]和RF...原创 2019-04-27 09:52:43 · 2664 阅读 · 0 评论 -
UNP编程:25---套接字选项之(ICMPv6套接字选项:IPPROTO_ICMPV6)
这个唯一的套接字选项由ICMPv6处理,它的级别(即getsockopt和setsockopt函数的第 二个参数)为IPPROTO_ICMPV6一、ICMP6_FILTER本选项允许我们获取或设置一个icmp6_filter结构,该结构指出256个可能的ICMPv6消息 类型中哪些将经由某个原始套接字传递给所在进程。我们将在28.4节再讨论本选项...原创 2019-04-27 09:52:52 · 1815 阅读 · 0 评论 -
UNP编程:26---套接字选项之(TCP套接字选项:IPPROTO_TCP)
原创 2019-04-27 09:52:57 · 2147 阅读 · 0 评论 -
UNP编程:27---套接字选项之(SCTP套接字选项:IPPROTO_SCTP)
待续原创 2019-04-27 09:53:00 · 1006 阅读 · 0 评论 -
UNP编程:28---fcntl函数
fcntl用法https://blog.youkuaiyun.com/qq_41453285/article/details/88945356一、汇总二、fcntl函数在网络编程中的作用三、套接字属主概念:套接字所属的进程或进程组...原创 2019-04-27 11:11:59 · 670 阅读 · 0 评论 -
UNP编程:29---名字与地址转换之(域名系统)
一、域名系统的概念域名系统(Domain Name System,DNS)主要用于主机名字与IP地址之间的映射。 主机名既可以是一个简单名字(simple name),例如solaris或bsdi,也可以是一个全限定域名(Fully Qualified Domain Name,FQDN),例如solaris.unpbook.com(严格说来,FQDN也称为绝对名字(absolute name...原创 2019-04-29 19:18:45 · 616 阅读 · 0 评论 -
UNP编程:30---名字与地址转换之(地址解析函数:gethostbyname()、gethostbyaddr()、hstrerror()、struct hostent)
一、引入认知计算机主机通常采用直观可读的名字。本书到目前为止的所有例子都有意使用IP地址而不是名字,这样我们能够确切地知道:对于诸如connect和sendto这样的函数,进入套接字地址结构的是什么内容;对于诸如accept和recvfrom这样的函数,返回的是什么内容。然而大多数应用程序应该处理名字而不是地址。当我们往IPv6转移时,这一点变得尤为正确,因为IPv6 地址(十六进制数串)比I...原创 2019-04-29 19:59:41 · 848 阅读 · 0 评论 -
UNP编程:31---名字与地址转换之(服务解析函数:getservbyname()、getservbyport()、struct servent)
一、服务名与端口的关系一个端口代表一个服务进程,因此可以使用服务名来代替端口的使用 一个端口代表一项服务 像主机一样,服务也通常靠名字来认知。如果我们在程序代码中通过其名字而不是其端口 号来指代一个服务,而 且 从 名字到端口号的映射关系保存在一个 文 件中(通常是 /etc/services),那么即使端口号发生变动,我们需修改的仅仅是/etc/services文件中的某 一行,而不必重...原创 2019-04-29 20:59:34 · 918 阅读 · 0 评论 -
UNP编程:32---名字与地址转换之(地址/服务解析函数:getaddrinfo、freeaddrinfo、gai_strerror、getnameinfo、addrinfo)
一、struct addrinfo结构体struct addrinfo { int ai_flags; /* AI_PASSIVE, AI_CANONNAME */ int ai_family; /* AF_xxx */ int ai_socktype; /* SOCK_xxx */ int ai_protocol; /* 0 or IPPROTO_xxx ...原创 2019-04-29 22:47:51 · 1575 阅读 · 0 评论 -
UNP编程:33---名字与地址转换之(作废的IPV6地址解析函数:gethostbyname2、getipnodebyname、freehostent、RES_USE_INET)
在开发IPv6期间,用于查找IPv6地址的API经历了若干次反复。这些早期的API既复杂又没 有足够的灵活性,于是在RFC 2553[Gilligan et al. 1999]中被淘汰掉。RFC 2553又引入了新的 函数,它们最终在RFC 3493[Gilligan et al. 2003]中被简单地替换成getaddrinfo和 getnameinfo。本节简要介绍一些早期的API,以辅助转换...原创 2019-05-03 17:39:46 · 1513 阅读 · 0 评论 -
UNP编程:34---名字与地址转换之(地址、服务解析函数总结)
我们在前面几篇文章中一直关注主机名和IP地址以及服务名和端口号。然而我们的视野可以更广阔 些,应用进程可能想要查找四类与网络相关的信息:主机、网络、协议和服务。大多数查找针对的是主机(gethostbyname和gethostbyaddr),一小部分查找针对的是服务(getservbyname 和getservbyport),更小一部分查找针对的是网络和协议 所有四类信息都可以存放在一个文件中,...原创 2019-05-03 17:43:53 · 569 阅读 · 0 评论 -
UNP编程:36---IPv4与IPv6的互操作性之(IPv6地址测试宏、IPv4与IPv6代码可移植性)
一、IPv6地址测试宏二、IPv4与IPv6代码可移植性原创 2019-05-04 09:34:08 · 564 阅读 · 0 评论 -
UNP编程:37---struct ifreq、 struct ifconf结构体
一、struct ifconf结构体功能:用来保存所有网络接口的名字和信息(不是全部信息,是ip地址)// if.h/* * Structure used in SIOCGIFCONF request. * Used to retrieve interface configuration * for machine (useful for programs which * mus...原创 2019-09-05 21:00:31 · 1462 阅读 · 0 评论 -
UNP编程:38---IO管理(五大IO模型)
一、IO复用的使用场景当客户处理多个描述符(通常是交互式输入和网络套接字)时,必须使用I/O复用 一个客户同时处理多个套接字是可能的,不过比较少见。我们将在非阻塞connect的文章中结合一个Web客户的上下文给出这种场合使用select的例子 如果一个TCP服务器既要处理监听套接字,又要处理已连接套接字,一般就要使用I/O复 用 如果一个服务器即要处理TCP,又要处理UDP,一般就要...原创 2019-04-28 13:02:31 · 857 阅读 · 0 评论 -
UNP编程:38---IO管理(select函数)
一、文件符集(fd_set)概念:文件符集可以看成是一个数组,可以向其中添加很多的文件描述符 数据类型:fd_set select就是通过获取文件符集进行操作的fd_set结构体的定义如下由此我们可以看出fd_set结构体仅包含一个整型数组,该数组的每一个元素的每一位(bit)标记一个文件描述符 FD_SETSIZE宏:限制了select能够同时处理的文件描述符的总量(在下面介绍...原创 2019-04-28 13:02:35 · 953 阅读 · 0 评论 -
UNP编程:39---IO管理(select函数的TCP服务端案例:批量输入、拒绝服务攻击)
一、str_cli函数现在我们可以使用select重写自定义str_cli函数,这样服务器进程一终止,客户就能马上得到通知。早先那个版本的问题在于:当套接字上发生某些事件时,客户可能阻塞于fgets调用。新版本改为阻塞于select调用,或是等待标准输入可读,或是等待套接字可读。 下图展示了调用select所处理的各种条件。客户的套接字上的三个条件处理如下:如果对端TCP发送数据,...原创 2019-04-28 13:18:18 · 528 阅读 · 0 评论 -
UNP编程:40---IO管理(shutdown函数)
一、shutdown与close的区别终止网络连接的通常方法是调用close函数。不过close有两个限制,却可以使用shutdown 来避免close的两个限制①close把描述符的引用计数减1,仅在该计数变为0时才关闭套接字。我们并发服务器模型文章中讨论过这一点。使用shutdown可以不管引用计数就激发TCP的正常连接终止序列 ②close终止读和写两个方向的数据传送。既然TC...原创 2019-04-28 22:11:28 · 826 阅读 · 0 评论 -
UNP编程:41---IO管理(pselect函数)
select函数使用:https://blog.youkuaiyun.com/qq_41453285/article/details/89336199一、pselect函数#include <sys/select.h>int pselect(int maxfdp1, fd_set *restrict readfds,fd_set *restrict writefds, fd_se...原创 2019-04-29 10:21:54 · 474 阅读 · 0 评论 -
UNP编程:42---IO管理(poll函数)
一、poll函数概念poll函数类似于select函数,但是接口使用不同 poll函数可用于任何类型的文件描述符二、struct pollfd结构体struct pollfd { int fd; /* file descriptor to check, or <0 to ignore */ short events; /* events of interest ...原创 2019-04-29 13:32:51 · 820 阅读 · 0 评论