牛客 Day2 TCP通信的流程

TCP是一种面向连接、可靠的传输协议,而UDP则是无连接、不可靠但高效的协议。TCP通信涉及服务器的监听、绑定、接受连接以及客户端的连接、数据交换,最后双方断开连接。在过程中,socket函数用于创建套接字,bind用于绑定IP和端口,listen进行监听,accept接受连接,connect发起连接,recv和send则用于数据的读写。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TCP通信流程

TCP和UDP的简单回顾;
TCP和UDP 是传输层协议。
UDP 是用户数据报协议的简写,面向无连接,可以单播,多播,广播,不仅支持一对一,还支持一对多,多对一,多对多的连接方式。udp是面向数据报的,不可靠的协议。效率高。不可靠。
TCP传输控制协议,面向连接的,可靠的。基于字节流的传输协议。仅支持单播传输。仅支持点对点的传输。

TCP 和 UDP 的对比

在这里插入图片描述

TCP 通信的流程

服务器端

服务器端是一个被动接受连接的角色

  1. 创建一个用于监听的套接字
  • 监听:监听有客户端的链接
  • 套接字:本质是一个文件描述符,
  1. 将监听的文件描述符和本地的IP和端口绑定(IP和端口就是服务器的地址信息)
  • 客户端连接服务器的时候使用的就是这个ip和端口;
  1. 设置监听,监听的fd开始工作。
  2. 阻塞等待,当有客户端发起连接,接触阻塞,接受客户端的连接,会得到一个和客户端通信的套接字。会产生一个新的文件描述符。第一个文件描述符只负责监听,第二个文件描述符用来通信。而不是用监听的文件描述符来进行通信。
  3. 通信
  • 接受数据
  • 发送数据
  1. 通信结束,断开连接

客户端

  1. 创建一个用于通信的套接字(fd)
  2. 连接服务器,需要指定连接的服务器的ip和端口。
  3. 连接成功,客户端可以直接和服务器通信
  • 接收数据
  • 发送数据
  1. 通信结束,断开连接。
    在这里插入图片描述

socket函数

创建套接字

在这里插入图片描述

#include<sys/types.h>
#include<sys/socket.h>
int socket(int domain,int type,int protocol);

在这里插入图片描述

int bind(int sockfd,const struct sockaddr*my_addr,socklen_t addrlen);

功能 绑定,将fd和本地ip+端口进行绑定
sockfd:通过socket函数得到的文件描述符
addr: 需要绑定的socket地址,这个地址封装了ip和端口信息
addrlen:第二个参数结构体占用的内存大小

监听socket

#include<sys/socket.h>
int listen(int sockfd,int backlog);

sockfd参数指定被监听的socket。backlog参数提示内核监听队列的最大长度。监听队列的长度如果超过backlog,服务器将不受理新的客户连接,客户端也将收到ECONNREFUSED错误信息

在这里插入图片描述
有两个队列,一个未连接队列,一个已连接队列,backlog是两个值的和 。backlog参数的典型值是5。

listen成功时返回0,失败则返回-1并设置errno。

接受连接

#include<sys/types.h>
#include<sys/socket.h>
int accept(int sockfd,struct sockaddr*addr,socklen_t*addrlen);

功能:接受客户端连接,默认是一个阻塞的函数,阻塞等待客户端的连接

addr参数用来获取被接受连接的远端socket地址 传出参数,记录了连接成功后的客户端信息(ip,port)
addrlen: 指定第二个参数对应的内存大小。
成功:用于通信的文件描述符
-1:失败

发起连接

#include<sys/types.h>
#include<sys/socket.h>
int connect(int sockfd,const struct sockaddr*serv_addr,socklen_t
addrlen);

功能:客户端连接服务器
参数 :
sockfd, 用于通信的文件描述符
serv_addr,客户端要连接的服务器的地址信息
addrlen:第二个参数的内存大小

返回值:
成功 0;
失败-1;

数据读写

Tcp数据读写
#include<sys/types.h>
#include<sys/socket.h>
ssize_t recv(int sockfd,void*buf,size_t len,int flags);
ssize_t send(int sockfd,const void*buf,size_t len,int flags);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值