网络编程套接字

认识端口号

端口号(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 数据报
相关推荐
C++忠实粉丝几秒前
Linux环境基础开发工具使用(2)
linux·运维·服务器
康熙38bdc24 分钟前
Linux 环境变量
linux·运维·服务器
l1x1n028 分钟前
网络安全概述:从认知到实践
网络
鄃鳕28 分钟前
HTTP【网络】
网络·网络协议·http
存储服务专家StorageExpert39 分钟前
DELL SC compellent存储的四种访问方式
运维·服务器·存储维护·emc存储
蜡笔小新星41 分钟前
Python Kivy库学习路线
开发语言·网络·经验分享·python·学习
hakesashou1 小时前
python如何比较字符串
linux·开发语言·python
Ljubim.te1 小时前
Linux基于CentOS学习【进程状态】【进程优先级】【调度与切换】【进程挂起】【进程饥饿】
linux·学习·centos
cooldream20092 小时前
Linux性能调优技巧
linux
长天一色2 小时前
【ECMAScript 从入门到进阶教程】第三部分:高级主题(高级函数与范式,元编程,正则表达式,性能优化)
服务器·开发语言·前端·javascript·性能优化·ecmascript