UNP——第四章,TCP套接字编程
1.socket 函数
首先被调用的函数,用于选择通信协议。
socket调用成功后,得到的套接字为主动套接字CLOSED状态。
PF 和 AF 的关系
PF的是协议族,AF是地址族,理论上一个PF包括多个AF,但实际上一个PF只实现了一个AF,所以两者在编程上是同等的。
2.connect
connect 发起主动握手,
connect 调用时,TCP 发送 SYN
TCP接收到 ACK时,connect 返回。
connect 前,可以不bind,内核会在connect 时随机分配原套接字。
connect 开始时,TCP从 CLOSED --> SYN_SEND,成功时, SYN_SEND --> ESTABLISH
每次 connect 失败后,都必须 close 套接字,并重新调用 socket。
3.bind
设置源套接字地址,套接字状态不改变
可以指定也可以不指定,不指定内核会分配,
设置为0则为不指定,
指定任意IP时,下面两种都一样,因为 INADDR_ANY == 0,大小端都一样
serv.sin_addr.s_addr = INADDR_ANY;
serv.sin_addr.s_addr = htonl(INADDR_ANY);
bind 返回的常见错误是, EADDRINUSE (地址已使用)。
4.listen
两个作用:
(1)套接字状态从主动状态--> 被动状态 CLOSED --> LISTEN
l (2)isten 初始化排队的最大连接个数。
内核为套接字分配了两个队列:
未完成连接队列,即正在进行三次握手的,这些套接字处于 SYN_RECV 状态。
已完成连接队列,即已经完成三次握手的,这些套接字处于 ESTABLISHED 状态。
backlog >= 两队列总和
5.accept
用于已连接队列头返回已连接。
如果已连接队列为空,则进程随眠。
accept 若成功,则返回内核重新分配的套接字。
6.典型的多进程并发服务器
for(;;) {
connfd = accept(listenfd, NULL, NULL);
if (fork() == 0) {
close(listenfd);
work();
close(connfd);
}
close(connfd);
}
父子进程都要 close 未用的套接字,以减少引用计数。
当 套接字关闭时,才会发出 FIN。
另外也避免了 文件描述符用尽。
7.close
减少套接字引用计数,当引用计数为0,则关闭套接字(TCP会发送FIN,对端TCP接受到FIN后,向应用层发送EOF)。
close后应用程序无法通过套接字继续读写操作。
但TCP会将剩余的数据进行收发。
8.getsockname 和 getpeername
通过 文件描述符,获得 套接字对信息。
用于子进程 exec 后,需要获得 父进程时的套接字对信息,因为套接字信息在内核区,不会被exec后覆盖,所以子进程只要获得 文件描述符即可(可通过命令行参数获得)
UNP——第四章,TCP套接字编程的更多相关文章
- UNP——第三章,套接字编程介绍
1.套接字结构 多数套接字函数都有套接字结构参数,每个协议族都定义了自己的套接字结构,以 sockaddr_ 开始,并对应协议族的唯一后缀. struct sockaddr_in { uint8_t ...
- 【UNIX网络编程(四)】TCP套接字编程具体分析
引言: 套接字编程事实上跟进程间通信有一定的相似性,可能也正由于此.stevens这位大神才会将套接字编程与进程间的通信都归为"网络编程",并分别写成了两本书<UNP1> ...
- UNP学习笔记1——基本TCP套接字编程
1 套接字地址结构 大多数套接字函数都需要一个指向套接字地址结构的指针作为参数.每个协议族都定义了自己的套接字结构.这些套接字的结构以sockaddr_开头,以每个协议族唯一的后缀名结尾. 1.1 I ...
- TCP套接字编程模型及实例
摘要: 本文讲述了TCP套接字编程模块,包括服务器端的创建套接字.绑定.监听.接受.读/写.终止连接,客户端的创建套接字.连接.读/写.终止连接.先给出实例,进而结合代码分析. PS:本文权当 ...
- unix网络编程第四章----基于TCP套接字编程
为了执行网络I/O操作.进程必须做的第一件事情就是调用Socket函数.指定期待的通信协议 #include<sys/socket.h> int socket(int family,int ...
- UNP学习笔记(第三章:套接字编程简介)
本章开始讲解套接字API. 套接字地址结构 IPv4套接字地址结构 它以sockaddr_in命名,下面给出它的POSIX定义 struct in_addr { in_addr_t s_addr; } ...
- 初探网络编程--TCP套接字编程演示
今天看了一下<计算机网络:自顶向下方法>,也就是计算机网络的教材的应用层一章,决定实现以下后面的Java C/S应用程序的例子,用来演示TCP和UDP套接字编程. 程序流程如下: 1.一台 ...
- TCP套接字编程
一.套接字(socket)函数 图1给出了在一个TCP客户与服务器通信的流程.服务器首先启动,稍后某个客户启动,它试图连接到服务器.假设客户给服务器发送一个请求,服务器处理该请求,并且给客户发回一个相 ...
- 套接字编程相关函数(2:TCP套接字编程相关函数)
本文摘录自<UNIX网络编程 卷1>. 基本套接字函数 socket函数 为了执行网络I/O,一个进程必须做的第一件事就是调用socket函数,指定期望的通信协议类型.其定义如下: #in ...
- <网络编程>基本TCP套接字编程
tcp提供了可靠传输,当tcp向另一端发送数据的时候,要求对端返回一个确认.如果没有接收到确认,tcp就重传数据并且等待更长时间,数次重传失败后,tcp才放弃. 建立一个tcp连接会发生如下事情: 服 ...
随机推荐
- 写了多年代码,你会 StackOverflow 吗
写了多年代码,你会 StackOverflow 吗 Intro 准备写一个傻逼代码的系列文章,怎么写 StackOverflow 的代码,怎么写死锁代码,怎么写一个把 CPU 跑满,怎么写一个 Out ...
- MeteoInfoLab脚本示例:线性拟合
MeteoInfoLab提供一个线性拟合函数linregress,参数是参与拟合的两个数据序列,返回拟合的斜率.截距和相关系数.有了上述拟合参数可以用polyval函数生成拟合数据(直线).然后可以将 ...
- phpstorm配置sftp自动上传
勾选自动上传 手动上传 qq_23049573 原创文章 14获赞 4访问量 2万+ 关注 私信
- Linux下批量kill掉进程
ps -ef|grep java|grep -v grep|cut -c 9-15|xargs kill -9 管道符"|"用来隔开两个命令,管道符左边命令的输出会作为管道符右边命 ...
- 【应用服务 App Service】当使用EntityFrameWorkCore访问Sql Server数据库时,在Azure App Service会出现Cannot create a DbSet for ** because this type is not included in the model for the context的错误
问题情形 使用EF Core访问数据库,在本地运行正常,发布到App Service后,偶尔出现了Cannot create a DbSet for ** because this type is n ...
- Anderson《空气动力学基础》5th读书笔记 第1记——流动相似性
在飞机真正上天之前,我们常常需要制作出缩小版的模型放在风洞中吹呀吹,尽可能地模拟真实飞行中的参数,这时我们就需要实现流动相似性,这便是本记要讲的. 文章目录 一.流动相似性的标准 二.流动相似性的应用 ...
- WCF服务创建到发布(SqlServer版)
在本示例开始之前,让我们先来了解一下什么是wcf? wcf有哪些特点? wcf是一个面向服务编程的综合分层架构.该架构的项层为服务模型层. 使用户用最少的时间和精力建立自己的软件产品和外界通信的模型. ...
- Windows下mysql5.6升级到5.7的方法
Mysql的升级方式分为两种:原地升级和逻辑升级.这两种升级方式,本质没有什么区别的. 只是在对数据文件的处理上有些区别而已.原地升级是直接将数据文件进行拷贝,而逻辑升级对数据文件的处理方式是通过逻辑 ...
- Cloudera Manager简介
Hadoop家族 整个Hadoop家族由以下几个子项目组成: Hadoop Common: Hadoop体系最底层的一个模块,为Hadoop各子项目提供各 种工具,如:配置文件和日志操作等. HDFS ...
- 【1】TensorFlow光速入门-tensorflow开发基本流程
本文地址:https://www.cnblogs.com/tujia/p/13862339.html 系列文章: [0]TensorFlow光速入门-序 [1]TensorFlow光速入门-tenso ...