UNP卷1读书笔记
文章平均质量分 55
oyw5201314ck
这个作者很懒,什么都没留下…
展开
-
1.通过tcp从daytime服务器获取时间
最近愈发觉得在学习源代码或者看书的时候,做下读书笔记,不仅能加深印象和理解,同时也方便日后进行回顾,所以就写下UNP(UNIX网络编程)卷1的读书笔记,涉及到的代码基本都是原作者提供的,为了方便编译做了一定简化,我是在Ubuntu上进行编译的,不同操作系统可能存在兼容问题。该书第一个小程序就是通过tcp从daytime服务器获取时间,代码如下:运行时传递一个daytime服务器的i原创 2017-08-17 11:57:42 · 4076 阅读 · 2 评论 -
13.线程互斥锁
当线程并发使用共享变量时,可能会产生不可预期的后果。为此,我们需要使用一定的手段来同步线程对共享变量的访问,互斥锁mutex就是一个解决办法。下面的代码用于演示,多线程编程下不进行同步可能产生的问题。2个线程并发对全局变量进行递增操作50000次,我们预期该全局变量最终的值为100000,但是不同步的情况下,最终值基本不会是100000.#include #include原创 2017-09-08 16:23:37 · 236 阅读 · 0 评论 -
12.线程特定数据TSD
线程特定数据TSD,也称线程私有数据,每个线程对TSD的修改仅对自己可见。POSIX中的TSD本质就是一个【索引:指针】键值对,如果我们要存放的数据很复杂,可将其存储在堆区,然后将其指针存储在TSD中;如果我们要存放的数据很简单,譬如一个整数或三两字符,可以直接存储在TSD上。#include #include #include // 要存储的TSD结构typedef s原创 2017-09-08 11:46:44 · 291 阅读 · 0 评论 -
11.多线程模型的echo服务器
相比fork一个子进程来处理网络请求,创建一个posix线程的代价要小得多,尽管fork使用写时复制(copy on write)技术进行了优化。另外,线程间共享内存地址空间,进行通信要比IPC简单的多,但这也带来了同步问题。UNP卷1第3版讲解pthread_join函数指定线程id用的是pthread_t指针,但是原型在Linux上如下:int pthread_join (原创 2017-09-07 18:02:31 · 294 阅读 · 0 评论 -
7.通过udp提供echo服务
使用UDP实现的一个简单echo服务器#include #include #include #include #define SERV_PORT 20000#define MAXLINE 4096void echo(int sockfd, struct sockaddr *client, socklen_t clilen){ int n; char m原创 2017-08-29 11:28:36 · 3228 阅读 · 0 评论 -
5.多进程同步模型的daytime服务器
前面实现的daytime服务器使用的单进程同步模型,处理完一个连接后才能处理下一个连接,这是最简单的服务器模型;在处理并发请求时,这种模型的效率十分低下,为了利用多核CPU的性能,我们可以为每个连接fork一个子进程来进行处理,这就是多进程同步模型原创 2017-08-25 17:17:48 · 910 阅读 · 0 评论 -
6.基于poll的TCP echo服务器
基于I/O多路复用poll模型的TCP echo服务器#include #include #include #include #include #include #include #define OPEN_MAX 1024#define MAXLINE 4096int main(int argc, char **argv){ struct sockaddr_in原创 2017-08-28 15:38:49 · 293 阅读 · 0 评论 -
10.获取网卡信息
我们可以使用ioctl函数获取网卡信息#include #include #include #include #include #include #include void get_if_info(){ int sockfd, len, flags; struct ifconf ifc; char *buf, *ptr, *cptr, last原创 2017-09-04 18:03:21 · 292 阅读 · 0 评论 -
8.解析主机名对应的别名和IPv4地址
使用gethostbyname解析主机名对应的别名和IPv4地址#include #include #include #include int main(int argc, char *argv[]){ char *ptr, **pptr; // INET_ADDRSTRLEN即为IPv4地址的点分十进制字符串形式的最大长度, 即16(包括字符串尾的结束符)原创 2017-08-31 16:17:56 · 1277 阅读 · 0 评论 -
9.通过服务名和协议名获取相关的服务信息
使用getservbyname解析服务名和协议名对应的端口号和服务别名该函数的原理其实就是通过一个文本或数据库里存放的服务信息来进行解析,在Linux下就是从/etc/services这个文件获取服务信息我们可以手动修改该文本中的信息来进行测试#include #include #include int main(int argc, char *argv[]){原创 2017-09-01 10:19:01 · 397 阅读 · 0 评论 -
3.获取主机字节序
以下方法在short为2个字节的编译器中比较有效#include int main(int argc, char **argv){ // 声明一个联合体 // 这里可以通过声明一个short和一个指向其起始地址的char指针的方式进行替代 union { short s; char c[sizeof(short)]; } u原创 2017-08-18 10:16:57 · 387 阅读 · 0 评论 -
2.通过tcp提供daytime服务
一个提供daytime服务的简单tcp服务端#include #include #include #include #include #define MAXLINE 4096int main(int argc, char **argv){ int listenfd, connfd; struct sockaddr_in servaddr; char b原创 2017-08-17 14:54:43 · 464 阅读 · 0 评论 -
4.IPv4和IPv6地址长度
IPv4地址的二进制形式长度为32,使用我们常用的点分十进制形式进行表示那么最长长度为15,例如“255.255.255.255”所以在posix的<netinet/in.h>中定义的IPv4地址字符串形式最大长度为16字节,‘\0’结束符也需要占据1个字节:#define INET_ADDRSTRLEN 16IPv6地址的二进制形式长度为128,使用16进制形式进行表示如“ffff:...原创 2017-08-18 11:02:13 · 59273 阅读 · 0 评论