UNP学习第四章tcp
一、TCP简单流程图
因为对于server我已经写过一篇笔记了:http://www.cnblogs.com/ch122633/p/8315883.html
所以我想再补充一些对于client的部分的笔记、和fork相关的总结。
二、connect函数:
#include <sys/socket.h> int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);
返回:0成功,-1出错
sockfd:套接字描述符
servaddr:套接口地址结构的指针
addrlen:该结构大小
客户在调用connect不必非调用bind,内核会选择源IP和临时端口。
connect函数会激发TCP三路握手过程,且仅在连接建立成功或出错时才返回。
bind函数:
#include <sys/socket.h> int bind(int sockfd, const struct sockaddr *myaddr, sockelt_t addrlen);
返回:0成功,-1出错
listen函数
#include <sys/socket.h> int listen(int sockfd, int backlog);
返回:0成功,-1出错
accept函数
#include <sys/socket.h> int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);
返回:非负描述字OK,-1出错
三、fork和exec函数
#include <unistd.h> pid_t fork(void);
返回:在子进程中为0,在父进程中为子进程ID,-1出错
fork有两个典型应用:
1.进程创建自己的一个拷贝,当拷贝处理一个操作时,其他的拷贝可以执行其他任务。(网络)
2.一个进程想执行其他程序,犹豫创建新进程的唯一方法是调用fork,然后调用exec执行新程序。(shell)
#include <unistd.h> int execl(const char *pathname, const char *arg0, ... /* (char *)0 */);
int execv(const char *pathname, char *const argv[]);
int execle(const char *pathname, const char *arg0, ...
/* (char *)0, char *const envp[] */);
int execve(const char *pathname, char *const argv[], char *const envp[]);
int execlp(const char *filename, const char *arg0, ... /* (char *)0 */);
int execvp(const char *filename, char *const argv[]);
返回:-1出错,无返回成功
四、并发服务器
迭代服务器:大多数UDP服务器时迭代服务器,被单个客户长时间占用。
并发服务器:TCP服务器多使用,能同时服务多个客户。
pid_t pid;
int listenfd, connfd; listenfd = Socket(...);
/* fill in sockaddr_in{} with server's well-known port */
Bind(listenfd, ...);
Listen(listenfd, LISTENQ);
for(; ;) {
connfd = Accept(listenfd, ...); /* probably blocks */
if((pid = Fork()) == ) {
Close(listenfd); /* child closes listening socket */
doit(connfd); /* process the request */
Close(connfd); /* done with this client */
exit(); /* child terminates */
}
Close(connfd); /* parent closes connected socket */
}
在服务器阻塞于accept调用、连接请求从客户到达时客户和服务器的状态。
从accept返回后,连接被内核接受,新的套接口即connfd被创建,这是一个已连接套接口,可由此通过连接读、写数据。
并发服务器下一步是调用fork,此时listenfd和connfd都是在父进程和子进程共享的。
一般套接口也用close关闭,终止TCP连接
#include <unistd.h> int close(int sockfd);
返回:0成功,-1出错
五、getsockname和getpeername函数
#include <sys/socket.h> int getsockname(int sockfd, struct sockaddr *localaddr, socklen_t *addrlen);
int getpeername(int sockfd, struct sockaddr *peeraddr, socklen_t *addrlen);
返回:0成功,-1出错
getsockname返回套接口关联的本地协议地址
getpeername返回套接口关联的远程协议地址
UNP学习第四章tcp的更多相关文章
- Java基础知识二次学习--第四章 异常
第四章 异常处理 时间:2017年4月26日11:16:39~2017年4月26日11:28:58 章节:04章_01节 04章_02节 视频长度:20:46+01:16 内容:异常的概念 心得: ...
- C#高级编程 (第六版) 学习 第四章:继承
第四章 继承 1,继承的类型 实现继承: 一个类派生于一个基类型,拥有该基类型所有成员字段和函数. 接口继承 一个类型只继承了函数的签名,没有继承任何实现代码. 2,实现继承 class MyDe ...
- UNP学习第六章(二)
一.描述符就绪条件 对于引起select返回套接字“就绪”的条件我们必须讨论得更明确: (1)满足一下塞个条件中的仍和一个时,一个套接字准备好读. a)该套接字接收缓冲区中的数据字节数不大于等于套接字 ...
- UNP学习第五章(二)
一.POSIX信号处理 信号:告知某进程发生了某个事件的通知(软中断),通常是异步的. 信号可以:由进程发给另一个进程,由内核发给某个进程. 设置信号处理办法,有三个选择: 1.写一个函数,在信号发生 ...
- UNP学习第五章
一.概述 想要写一个完整的TCP客户-服务器程序例子,有下面功能的回射服务器 1.客户从标准输入读一行文本,写到服务器上: 2.服务器从网络输入读此行,并回射给客户: 3.客户读此回射行并写到标准输出 ...
- 深度学习框架PyTorch一书的学习-第四章-神经网络工具箱nn
参考https://github.com/chenyuntc/pytorch-book/tree/v1.0 希望大家直接到上面的网址去查看代码,下面是本人的笔记 本章介绍的nn模块是构建与autogr ...
- 【TCP/IP详解 卷一:协议】第二十四章 TCP的未来与性能
来到了TCP的最后一个章节,未来与性能.在当时(1991年)的未来,如今已经部分变为现实,部分就只是历史中的实验. 主要内容: 路径MTU的发现与TCP的结合. 长肥管道 和 高速千兆比网络. 窗口扩 ...
- UNP学习笔记1——基本TCP套接字编程
1 套接字地址结构 大多数套接字函数都需要一个指向套接字地址结构的指针作为参数.每个协议族都定义了自己的套接字结构.这些套接字的结构以sockaddr_开头,以每个协议族唯一的后缀名结尾. 1.1 I ...
- Netty学习第四章 spring boot整合netty的使用
现在大多数项目都是基于spring boot进行开发,所以我们以spring boot作为开发框架来使用netty.使用spring boot的一个好处就是能给将netty的业务拆分出来,并通过spr ...
随机推荐
- 深度学习中的batch、epoch、iteration的含义
深度学习的优化算法,说白了就是梯度下降.每次的参数更新有两种方式. 第一种,遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度,更新梯度.这种方法每更新一次参数都要把数据集里的所有样本都看一遍, ...
- kPagination纯js实现分页插件
kPagination分页插件 纯js分页插件,压缩版本~4kb,样式可以自定义 demo 使用方法 <div id="pagination"></div> ...
- python中将12345转换为'12345',不要使用str
a = 12345 #创建一个空字符串 ret = "" #whlie循环,条件为当a为true时,即a不是 0的时候 while a : #定义一个变量,对a求余 last = ...
- python中socket理论
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单 ...
- python练习题返回列表中的第二小的元素的下标
# 第三题:返回列表中的第二小的元素的下标 # 1.参数是一个列表,元素全部是整数 # 2.返回第二小的元素的下标 def seconde_min(lt): n = len(lt) if lt[0]& ...
- bzoj 1233: [Usaco2009Open]干草堆tower 【想法题】
首先这题的$n^3$的DP是比较好想的 $f[i][j]$表示用前$i$包干草 且最顶层为第$j+1$包到第$i$包 所能达到的最大高度 然而数据范围还是太大了 因此我们需要去想一想有没有什么单调性 ...
- webpack 中vue文件使用scss需要注意的地方
需要使用npm添加node_sass和sass_loader 并且在配置文件中添加规则: { test: /\.scss$/, use: ["style-loader", &quo ...
- MSDN上关于WinDbg的手册
参考:http://msdn.microsoft.com/en-us/library/windows/hardware/ff540507(v=vs.85).aspx 这是最靠谱的参考了,比.hh要直观 ...
- 斯坦福【概率与统计】课程笔记(三):EDA | 直方图
单个定量变量的直方图表示 大家知道,定量变量是连续型变量,即不会像分类变量那样有明显的分类,那么如何将其画成直方图呢?一般来说,会将其按照某个维度来将其分组(group),举个例子. 我们有15个学生 ...
- P3375 【模板】KMP字符串匹配——kmp算法
先上一波题目 https://www.luogu.org/problem/P3375 kmp模板 看了好久才想起来是个什么东西qwq #include<cstdio> #include&l ...