详解基本TCP套接字函数
指定期望的通信协议类型。
- #include <sys/types.h> /* See NOTES */
- #include <sys/socket.h>
- int socket(int domain, int type, int protocol);
- 返回:若成功则为非负描述符,出错则为-1。
参数说明:
domain: 指明协议族,也称为协议域,是一个常值。
AF_INET IPv4 协议
AF_INET6 IPv6 协议
AF_LOCAL/AF_UNIX Unix协议域
AF_ROUTE 路由套接字
AF_KEY 密匙套接字
type: 指明套接字的类型。
SOCK_STREAM 字节流套接字
SOCK_DGRAM 数据报套接字
SOCK_SEQPACKET 有序分组套接字
SOCK_RAW 原始套接字
protocol: 指明协议类型。一般为0,以选择给定的domain和type组合的系统默认值。
IPPROTO_TCP TCP传输协议
IPPROTO_UDP UDP传输协议
IPPROTO_SCTP SCTP传输协议
函数描述:
socket 函数在成功时返回一个小的非负整数值,与文件描述符类似,我们称它为套接字
描述符,简称 sockfd。为了得到这个套接字描述符,我们只是指定了协议族(IPv4、IPv6
或Unix)和套接字类型(字节流、数据报或原始套接字)。我们并没有指定本地跟远程的
协议地址。
2、connect 函数
TCP 客户用 connect 函数来与 TCP 服务器建立连接。
- #include <sys/socket.h>
- int connect( int sockfd, const struct sockaddr *servaddr, socklen_t addrlen );
- 返回:若成功则为0,出错则为-1。
参数说明:
sockfd: 由 socket 函数返回的套接字描述符。
servaddr、addrlen:指向一个套接字地址结构的指针和该结构的大小。套接字地址结构
必须含有服务器的IP地址和端口号。
函数描述:
客户在调用 connect 函数前并不一定得调用 bind 函数,如果需要的话,内核会确定源
IP地址,并选择一个临时端口作为源端口。所以在客户进程中的套接字一般只需指明客户
所要连接的服务器的IP跟端口号。
如果是 TCP 套接字,调用 connect 函数将激发 TCP 的三路握手。而且仅在连接成功或
出错时才返回。其中出错的情况有如下几种:
1-> TCP 客户没有收到 SYN 分节的响应。
2-> TCP 服务器对客户的 SYN 分节的响应是 RST 。
3-> 客户发出的 SYN 分节在某个路由器器上发生了错误。
若 connect 调用失败则该套接字不再可用,必须关闭,我们不能对这样的套接字再次执行
connect 函数。
3、bind 函数
将一个本地协议地址赋予一个套接字。对于网际网协议,协议地址是32位的IPv4地址和128
位的IPv6地址与16位的TCP或UDP端口号的组合。bind 函数主要用于服务器端,用来指定本地
主机的哪个网络接口(IP,可以是INADDR_ANY,表示本地主机的任一网络接口)可以接受客户
端的请求,和指定端口号(即开启的等待客户来连接的进程)。
- #include <sys/socket.h>
- int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);
- 返回:若成功则为0,出错则为-1。
sockfd: socket 函数返回的套接字描述符。
myaddr、addrlen:指向一个套接字地址结构的指针和该结构的大小。
函数描述:
对于 TCP ,调用 bind 函数可以指定一个端口号,或指定一个IP地址,也可以两者都指定,还
可以两者都不指定。
服务器在启动时捆绑它们众所周知的端口号(如何捆绑?)。如果一个TCP客户或服务器未曾调用
bind捆绑一个端口,当调用 connect 或 listen 时,内核就要为相应的套接字选择一个临时端口。
让内核来选择临时端口对于TCP客户来说是正常的,除非应用需要一个预留端口。然而对于TCP服务
器来说却极为罕见,因为服务器是通过它们的众所周知的端口号来被大家认识的。
进程可以把一个特定的IP捆绑到它的套接字上,不过这个IP地址必须属于其所在主机的网络接口之
一(对于TCP服务器)。对于TCP客户,这就为在该套接字上发送的IP数据报指派了源IP地址(服务器
源地址)。对于TCP服务器,这就限定该套接字只接收那些目的地为这个IP地址的客户连接。TCP套接
字通常不把IP地址捆绑到它的套接字上。当连接套接字时,内核将根据所用外出网络接口来选择源IP
地址,而所用外出端口则取决于到达服务器所需的路径。如果TCP服务器没有把IP地址捆绑到它的套接
字上,内核就会把发送的SYN的目的IP地址作为服务器的源IP地址(即服务器IP等于INADDR_ANY的情
实际上客户的源IP地址就是服务器的目的地址,服务器的源IP地址就是客户的目的地址,说到底也就只
存在两个IP地址:客户IP跟服务器IP。
- #include <sys/socket.h>
- int listen(int sockfd, int backlog);
- 返回:若成功则为0,出错则为-1。
listen 函数仅由 TCP 服务器调用,它做两件事情。
(1)把一个未连接的套接字(主动)转换成一个被动套接字,指示内核应该接受指向该套接字的连接请
(2)backlog 参数规定了内核应该为相应套接字排队的最大连接数。其中内核始终为监听套接字维护两个
队列。
(1)未完成连接队列,每个SYN分节对于其中一项:
已由某个客户发出并到达服务器,而服务器正在等待待完成的TCP三路握手过程。这些套接字处
(2)已完成连接队列
每个已完成TCP三路握手过程的客户对应其中一项。这些套接字处于ESTABLISHED状态。
backlog 就是这两个队列和的最大值。
在三路握手完成之后,但在服务器调用 accept 之前到达的数据应由 TCP 服务器排队,最大数据量为
accept 函数由 TCP 服务器调用,用于从已完成连接队列头返回下一个已完成连接。如果已完成队列为
- #include <sys/socket.h>
- int accept(int sockfd ,struct sockaddr *cliaddr, socklen_t *addrlen);
- 返回:若成功则为非负已连接描述符和对端的IP和端口号,出错则为-1。
cliaddr、addrlen 用来返回已连接的对端进程(客户)的协议地址 。调用前,我们将由 *addrlen 所
引用的整数值置为由cliaddr所指的套接字地址结构的长度,返回时,该整数值即为内核存放在该套接字
地址机构内的确切字节数。
函数描述:
如果 accept 调用成功,那么其返回值是由内核自动生成的一个全新描述符,代表着与所返回客户的TCP
连接。在讨论 accept 函数时,我们称它的第一个参数为监听套接字描述符(由 socket 创建,随后用
6、fork 函数
是 Unix 中派生新进程的唯一方法。
- #include<unistd.h>
- pid_t fork(void);
- 返回:在子进程中为0,在父进程中为子进程ID,出错则为-1.
函数描述:
fork 调用一次却返回两次。它在调用进程(父进程)中返回一次,返回值是新派生进程(子进程)
的进程ID号;在子进程又返回一次,返回值为0。因此,返回值本身告知当前进程是子进程还是父
进程。
fork 在子进程返回0而不是父进程的进程ID的原因在于:任何子进程只有一个父进程,而且子进程
总是可以通过调用 getppid 取得父进程的进程ID。相反,父进程可以有许多子进程。而且无法通过
函数调用来获取子进程的进程ID。如果父进程想要跟踪所有子进程的进程ID,那么它必须记录每次
fork 调用的返回值。当前进程可以通过 getpid 系统调用来获得自己的进程ID。
父进程中调用 fork 之前打开的所有描述符在 fork 返回之后由子进程共享,数据段会得到一份拷贝
而不是共享。
fork 调用的两个典型用法:
(1)一个进程创建一个自身的副本,这样每个副本都可以在另一个副本执行其他任务的同时处理各自的
操作。这是网络服务器的典型用法。
(2)一个进程想要执行另一个程序。既然创建新进程的唯一方法是调用 fork ,该进程于是首先调用
6、exec 函数族
一个 exec 函数可以把当前进程替换成一个新进程,新进程由 path 或 file 参数指定。
- #include <unistd.h>
- extern char **environ;
- int execl(const char *path, const char *arg, ...);
- int execlp(const char *file, const char *arg, ...);
- int execle(const char *path, const char *arg,
- ..., char * const envp[]);
- int execv(const char *path, char *const argv[]);
- int execvp(const char *file, char *const argv[]);
- int execve(const char *path, char *const argv[], char *const envp[]);
- 返回:成功则不返回,出错则为-1。
函数描述:
这 6 个 exec 函数之间的区别在于:(a)待执行的程序的文件名是由文件名(file)指定还是由路径名
7、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);
- 返回:成功则不返回,出错则为-1。
详解基本TCP套接字函数的更多相关文章
- 网络-05-端口号-F5-负载均衡设-linux端口详解大全--TCP注册端口号大全备
[root@test1:Standby] config # [root@test1:Standby] config # [root@test1:Standby] config # [root@test ...
- 网络-04-端口号-linux端口详解大全--TCP注册端口号大全
# John Murphy <john.m.murphy&mci.com>afs3-fileserver 7000/tcp file server itselfafs3-files ...
- TCP/IP 详解卷一 - TCP CWR、ECE、URG、ACK、PSH、RST、SYN、FIN控制位
from:https://blog.csdn.net/u012243115/article/details/43487461 2015年02月04日 15:56:32 阅读数:1464 TCP 和 U ...
- firewall-cmd 防火墙命令详解 及 TCP Wrappers
firewall-cmd 常用参数及作用 参数 作用 --get-default-zone 查询默认的区域名称 --set-default-zone=<区域名称> 设置默认的区域,使其永久 ...
- 详解 awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}每个字段的意思
用这个列子说好了如果NF代表字段 那最后应该是7 才对啊 还有最后怎么都是1呢?END前面的是查看并发吧 后面是查看 tcp连接数 是这样吗? awk下标采用字符串来表示可能你在其它语言见 ...
- 网络传输层之TCP/UDP详解
一.运输层协议概述 从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层. 运输层的任务就是负责主机中两个进程之间的通信,其数据传输的单 ...
- python中的tcp示例详解
python中的tcp示例详解 目录 TCP简介 TCP介绍 TCP特点 TCP与UDP的不同点 udp通信模型 tcp客户端 tcp服务器 tcp注意点 TCP简介 TCP介绍 TCP协议 ...
- --系统编程-网络-tcp客户端服务器编程模型、socket、htons、inet_ntop等各API详解、使用telnet测试基本服务器功能
PART1 基础知识 1. 字节序 网络字节序是大端字节序(低地址存放更高位的字节), 所以,对于字节序为小端的机器需要收发网络数据的场景,要对这些数据进行字节序转换. 字节序转换函数,常用的有四个: ...
- TCP三次握手与四次挥手详解
目录 TCP三次握手与四次挥手详解 1.TCP报文格式 2.TCP三次握手 3.TCP四次挥手 4.为什么建立连接需要三次握手? 5.为什么断开连接需要四次挥手? 6.为什么TIME_WAIT状态还需 ...
随机推荐
- async 和 await的前世今生 (转载)
async 和 await 出现在C# 5.0之后,给并行编程带来了不少的方便,特别是当在MVC中的Action也变成async之后,有点开始什么都是async的味道了.但是这也给我们编程埋下了一些隐 ...
- 《剑指offer》第三_一题(找出数组中重复的数字,可改变数组)
// 面试题3(一):找出数组中重复的数字 // 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字是重复的,但不知道有几个数字重复了, // 也不知道每个数字重复了几次.请 ...
- 【转】cs231n学习笔记-CNN-目标检测、定位、分割
原文链接:http://blog.csdn.net/myarrow/article/details/51878004 1. 基本概念 1)CNN:Convolutional Neural Networ ...
- Observable类API
包java.util 类 Observable public class Observable extends Object 此类表示模型视图范例中的 observable 对象,或者说“数据”.可将 ...
- root登录不进去 dropbear ssh
安装好了dropbear, root 怎么也登录不进去. 看 /var/log/messages , 发觉有很多下面的消息, 网上查了一下, 发觉建个 /etc/shells 文件,然后把 /bin/ ...
- springboot集成mybatis及mybatis generator工具使用
原文链接 前言mybatis是一个半自动化的orm框架,所谓半自动化就是mybaitis只支持数据库查出的数据映射到pojo类上,而实体到数据库的映射需要自己编写sql语句实现,相较于hibernat ...
- JVM中对象的内存布局与访问定位
一.对象的内存布局 已主流的HotSpot虚拟机来说, 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header).实例数据(Instance Data)和对齐填 ...
- 12月14日 bs-grid , destroy_all()
bootstrap Grid : The Bs grid system has four classes: xs (phones), sm (tablets), md (desktops), and ...
- ajax思维导图
- python-day46--前端基础之html
一.html是什么? 超文本标记语言(Hypertext Markup Language,HTML)通过标签语言来标记要显示的网页中的各个部分.一套规则,浏览器认识的规则 浏览器按顺序渲染网页文件,然 ...