网络编程客户端和服务端连接流程

复制代码
服务器端:

socket()-->bind( )-->listen()-->accept()-->read()/write()--->close()

socket()//创建套接字
bind()//命名socket,分配套接字地址
listen()//监听状态,等待连接请求状态
accept()//允许连接(被动连接)
read()/write()或者send()/recv() //进行数据交换
close()//断开连接

客户端: 

socket()-->connect()-->read()/write()-->close()

socket()//创建套接字
connect()//请求连接
read()/write() send()/recv()//进行数据交换
close()//断开连接

对于服务端,创建socket后需要分配其地址,调用bind函数

XML 复制代码
#include <sys/types.h> 					
#include <sys/socket.h>
bind(socket,(struct sockaddr*)addr,socklen_t addrlen)
//该函数参数为需要命名的socket,socket地址和该地址的长度。addr的IP为自己主机的IP地址

//返回值  成功0
          失败 -1并设置erron

而对于客户端,socket地址是匿名分配的,不需要自己来分配,只需要用connect函数来请求连接,该连接为主动连接。

XML 复制代码
#include <sys/types.h> 					
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

参数:
第一个参数:int sockdf:
		    socket文件描述符
第二个参数: const struct sockaddr *addr:
			传入参数,指定服务器端地址信息,含IP地址和端口号
第三个参数:socklen_t addrlen:
			传入参数,传入sizeof(addr)大小
返回值:
	成功: 0
	失败:-1,设置errno

客户端发送connect()连接请求后,并不意味着服务端执行accept后才接收连接,因此connect()返回后不代表进行数据交换。客户端的连接请求首先会存放到listne创建的监听队列中,而accept只是从监听队列中取出连接,不关心连接处于何种状态(比如ESTABLISHED和CLOSE_WAIT),更不关心网络状态的变化。

XML 复制代码
#include<sys/socket.h>
int listen(int sockfd,int backlog);

//参数1: 表示进入监听的命名后的socket
//参数2: 表示内核监听队列最大长度,linux2.2后表示完全连接状态的最大上限

//返回:
// 成功:0
// 失败:-1 设置erron
XML 复制代码
#include<sys/types.h>
#include<sys/socket.h>
int accept(int sockfd,struct sockaddr*addr,socklen_t*addrlen);

//参数1: 执行过listen系统调用的监听socket

//参数2 :客户端的socket地址(自动分配)

//参数3: 客户端的socket地址长度

//返回值  
// 成功: 0
//失败 : -1 设置erron
相关推荐
是娇娇公主~42 分钟前
HTTPS【密钥交换+证书校验】流程讲解
网络·网络协议·面试·https·ssl
南棱笑笑生1 小时前
20251224给飞凌OK3588-C开发板适配Rockchip原厂的Buildroot【linux-6.1】系统时确认ssh服务【内置dropbear】
linux·c语言·ssh·rockchip
I · T · LUCKYBOOM1 小时前
30.Firewalld-Linux
linux·运维·安全
沙滩小绵羊1 小时前
Linux常见命令
linux·运维·服务器
驰羽1 小时前
NAT模式下VMware的虚拟机DNS解析失败的问题解决
linux·网络·dns
菜鸡00012 小时前
安装G2O
linux
誰能久伴不乏2 小时前
epoll 学习踩坑:`fcntl` 设置非阻塞到底用 `F_SETFL` 还是 `F_SETFD`?
linux·服务器·网络·c++·tcp/ip
阿巴~阿巴~3 小时前
告别命令行:Navicat可视化操作数据库(附安装使用教程)
服务器·数据库·mysql·navicat·可视化操作数据库
TG:@yunlaoda360 云老大4 小时前
华为云国际站代理商跨境容灾是如何实现的?
服务器·数据库·华为云
来鸟 鸣间4 小时前
MIPI D-PHY 理解
linux·音视频·sensor·mipi