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报文,报文中会携带当前缓冲区大小

相关推荐
Joeysoda1 小时前
数据库索引:秋招面试中的经典高频题目 [特殊字符](索引原理/操作/优缺点/B+树)
数据库·sql·学习·mysql·adb·oracle
会飞的爱迪生4 小时前
mac连接linux服务器
linux·服务器·macos
纠结哥_Shrek6 小时前
pytorch实现半监督学习
人工智能·pytorch·学习
YuLiu123216 小时前
Vue3学习笔记-Vue开发前准备-1
vue.js·笔记·学习
Bluesonli6 小时前
UE5 蓝图学习计划 - Day 11:材质与特效
学习·ue5·虚幻·材质·虚幻引擎·unreal engine
玥轩_5217 小时前
《Linux服务与安全管理》| 数据库服务器安装和配置
linux·运维·服务器·数据库·安全·网络安全·redhat
深度Linux7 小时前
探秘Linux IO虚拟化:virtio的奇幻之旅
linux·c/c++·virtio·虚拟化技术
江湖有缘8 小时前
Linux系统之whereis命令的基本使用
linux·运维·服务器
老大白菜8 小时前
在 Ubuntu 中使用 Conda 创建和管理虚拟环境
linux·ubuntu·conda
捡破烂的加菲猫8 小时前
Zookeeper入门部署(单点与集群)
linux·分布式·zookeeper