网络编程套接字

认识端口号

端口号(port)是传输层协议的内容

  • 端口号是一个2字节16位的整数
  • 一个进程可以绑定多个端口号; 但是一个端口号不能被多个进程绑定
  • 端口号用来标识一个进程 , 告诉操作系统 , 当前的这个数据要交给哪一个进程来处理
  • 一个端口号只能被一个进程占用
    • IP 地址 + 端口号能够标识网络上的某一台主机的某一个进程

socket****编程接口

socket 常见 API

cpp 复制代码
// 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)
int socket(int domain, int type, int protocol);
// 绑定端口号 (TCP/UDP, 服务器) 
int bind(int socket, const struct sockaddr *address,
 socklen_t address_len);
// 开始监听socket (TCP, 服务器)
int listen(int socket, int backlog);
// 接收请求 (TCP, 服务器)
int accept(int socket, struct sockaddr* address,
 socklen_t* address_len);
// 建立连接 (TCP, 客户端)
int connect(int sockfd, const struct sockaddr *addr,
 socklen_t addrlen);

socket函数

cpp 复制代码
int socket(int domain, int type, int protocol);
domain:地址族规范,最常见的有俩种,AF_INET或AF_INET6,这是IPv4和IPv6的Internet地址族格式
type:新套接字的类型规范,常见参数如下
     SOCK_STREAM:一种套接字类型,可通过OOB数据传输机制提供顺序的,可靠的,双向的,基于连接的字节                
                 流。 此套接字类型将传输控制协议(TCP)用于Internet地址系列(AF_INET或AF_INET6)
     SOCK_DGRAM2:一种支持数据报的套接字类型,这些数据报是无连接的,不可靠的最大长度固定(通常很    
                 小)的缓冲区。 此套接字类型对Internet地址系列(AF_INET或AF_INET6)使用用户数据 
                 报协议(UDP)
protocol:如果指定的值为0,则调用者不希望指定协议,服务提供商将选择要使用的协议
返回值:成功接返回创建的套接字,失败返回-1,并设置相关错误码

                

bind函数

cpp 复制代码
int bind(int socket, const struct sockaddr *address,socklen_t address_len);
参数 sockfd ,需要绑定的socket
参数 addr ,存放了服务端用于通信的地址和端口
参数 addrlen ,表示 addr 结构体的大小
返回值:成功返回0,失败返回-1

listen函数

cpp 复制代码
int listen(int socket, int backlog);
socket:要被监听的套接字
backlog:指定队列的容量,这个队列用于记录正在连接但是还没有连接完成的客户端,一般设置队列的容量为2,3    
        即可。队列的最大容量需要小于30
返回值:成功返回0,失败返回-1

accept函数

cpp 复制代码
int accept(int socket, struct sockaddr* address,socklen_t* address_len);
socket:listen监听的套接字
address:输出型参数,用获取,连接者的信息
address_len:address所占字节大小
返回值:成功返回0,失败返回-1

connect函数

cpp 复制代码
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
sockfd:连接方的套接字
addr:储存连接方的地址,套接字等
addrlen:addr的长度
返回值:成功返回0,失败返回-1,并设置相关错误码

地址转换函数

字符串转in_addr的函数:

in_addr转字符串的函数:

三次握手

  • 调用socket, 创建文件描述符
  • 调用connect, 向服务器发起连接请求
  • connect会发出SYN段并阻塞等待服务器应答; (第一次)
  • 服务器收到客户端的SYN, 会应答一个SYN-ACK段表示"同意建立连接"; (第二次)
  • 客户端收到SYN-ACK后会从connect()返回, 同时应答一个ACK段; (第三次)

四次挥手

  • 如果客户端没有更多的请求了, 就调用close()关闭连接, 客户端会向服务器发送FIN段(第一次)

  • 此时服务器收到FIN后, 会回应一个ACK, 同时read会返回0 (第二次)

  • read返回之后, 服务器就知道客户端关闭了连接, 也调用close关闭连接, 这个时候服务器会向客户端发送 一个FIN; (第三次)

  • 客户端收到FIN, 再返回一个ACK给服务器; (第四次)

TCPUDP****对比

  • 可靠传输 vs 不可靠传输
  • 有连接 vs 无连接
  • 字节流 vs 数据报
相关推荐
楼田莉子2 分钟前
Linux学习:基础IO相关学习
linux·开发语言·c++·后端·学习
小陈phd6 分钟前
langgraph从入门到精通(一)——langgraph概念解析
linux·运维·数据库
阿巴~阿巴~10 分钟前
解锁HTTP方法奥秘:GET与POST的深度探索与实战演示
服务器·网络·网络协议·http·get·post·请求方法
小许学java12 分钟前
网络编程套接字
java·网络·udp·socket·tcp·套接字
inquisiter13 分钟前
cove-salus-tellus测试程序时序逻辑
linux·服务器·网络·riscv
这儿有一堆花14 分钟前
告别“脚本小子”:真正理解 Linux 包管理器
linux
噜啦噜啦嘞好26 分钟前
Linux:线程池
linux·运维·c++
代码不行的搬运工31 分钟前
使用多代理间 AS 诊断系统检测和恢复前缀劫持(2010)
网络·bgp安全
屿行屿行32 分钟前
【Linux】音视频处理(gstreamer和ffmpeg的实际应用)
linux·ffmpeg·音视频·视频编解码
用户311879455921833 分钟前
银河麒麟V10 申威架构 docker-compose rpm 包安装教程(附命令)
linux