Linux高并发服务器开发(八)Socket和TCP

文章目录

  • [1 IPV4套接字结构体](#1 IPV4套接字结构体)
  • [2 TCP客户端](#2 TCP客户端)
  • [3 TCP服务器](#3 TCP服务器)
  • [4 三次握手](#4 三次握手)
  • [5 四次挥手](#5 四次挥手)
  • [6 滑动窗口](#6 滑动窗口)

1 IPV4套接字结构体

2 TCP客户端

特点:出错重传 每次发送数据对方都会回ACK,可靠

tcp是打电话的模型,建立连接 使用连接 关闭连接

1.创建套接字api

函数


3 TCP服务器

比客户端多两个

bind 绑定端口号,

accpet 监听端口号

流程

1.创建套接字 socket

2.给套接字绑定端口和ip bind

3.进行监听 listen

将套接字由主动转换为被动

创建一个链接队列

4.提取链接 accept

从已完成链接队列提取链接

提取链接得到一个已连接的套接字,接下来用这个已连接的套接字和客户端通信

5.进行读写

6.关闭fd

函数

`

代码

cpp 复制代码
#include<sys/socket.h>
#include<stdio.h>
#include<arpa/inet.h>
#include <unistd.h>

int main()
{
    // 创建套接字
    int lfd = socket(AF_INET, SOCK_STREAM, 0);

    // 绑定
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(8000);
    // addr.sin_addr.s_addr =INADDR_ANY; // 如果是0,绑定的是通配地址
    inet_pton(AF_INET, "192.168.1.1", &addr.sin_addr.s_addr);
    bind(lfd, (struct sockaddr*)&addr, sizeof(addr));

    // 监听
    listen(lfd, 128);

    // 提取
    struct sockaddr_in cliaddr;
    socklen_t len = sizeof(cliaddr);
    int cfd = accept(lfd, (struct sockaddr*)&cliaddr,&len);
    char ip[16]= "";
    printf("new client ip = %s, port = %s", inet_ntop(AF_INET, &cliaddr.sin_addr.s_addr,ip,16));
    // 读写
    char buf[1024] = "";
    
    while(1)
    {
       
        int n = read(STDIN_FILENO, buf,sizeof(buf));
        write(cfd, "hello",5);
        read(cfd,buf,sizeof(buf));
        printf("%s\n",buf);

    }

    // 关闭
    close(lfd); // 关闭新连接
    close(cfd); // 关闭已经连接的

    return 0;
}

粘包

服务器向客户端发送 第一次发送512字节,当客户端还没读取完全时,又发送了1024个字节,则会发生粘包

4 三次握手


5 四次挥手

关闭,半关闭(只关闭应用层的收发,但底层还能收发)

mss 最大报文长度,一般出现在三次握手的前两次,用来告知对方发送数据的最大长度

MTU:最大传输单元 网卡

6 滑动窗口

窗口尺寸,缓冲区大小

红区有多大,还剩多少,

每一次读取数据后,回ack报文,报文中会携带当前缓冲区大小

相关推荐
前端基地2 分钟前
昇思25天学习打卡营第6天|关于函数与神经网络梯度相关技术探讨
人工智能·python·深度学习·神经网络·学习·机器学习·ai编程
to be a question6 分钟前
【物联网工程导论期末复习完整知识点】第四章物联网智能硬件与嵌入式
笔记·物联网·智能硬件·期末复习
zhishengwangxiao19 分钟前
职升网:一级计量师证书含金量有多少?
运维·服务器
cpp_learners26 分钟前
Linux 程序卡死的特殊处理
linux·shell·c/c++·程序卡死·守护程序
傅沈骁fsx29 分钟前
昇思25天学习打卡营第15天|DCGAN生成漫画头像
学习
科学的发展-只不过是读大自然写的代码29 分钟前
ubuntu 进入命令行
linux·运维·ubuntu
念晚91734 分钟前
Linux——测网速例子,在网站查看生成的图片
linux·运维·服务器·网络·数据库
luckyme_1 小时前
STM32-GPIO学习内容
stm32·嵌入式硬件·学习
-Se7ven1 小时前
Linux修改服务器hostname方法
linux·服务器·github
love6a61 小时前
从零开始学习网络安全渗透测试之Linux基础篇——(六)Linux网络及防火墙配置
linux·学习·web安全