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

相关推荐
杨云龙UP9 分钟前
MySQL 数据库常用备份工具对比:mysqldump、mydumper 与 XtraBackup
linux·运维·服务器·数据库·mysql·dba·备份恢复
happymagic1 小时前
java spring boot做的jar包程序,如何实现自动运行启动
java·运维·服务器·spring boot·jar
风曦Kisaki2 小时前
Kubernetes(K8s)笔记Day06: 持久化存储(emptyDir,hostPath,NFS),PV 和 PVC,StorageClass存储类
linux·运维·笔记·云原生·容器·kubernetes
Dr.kangder2 小时前
嵌入式处理器仿真技术——Hypervisor 原理与实践
服务器·嵌入式硬件·架构·嵌入式
_艾伦 耶格尔.2 小时前
基础I/O
linux
星蓝_starblue4 小时前
零服务器、零数据库!开源growth-board,利用GitHub自动管理刷题/学习/求职全流程
服务器·数据库·程序人生·系统架构·node.js·github·改行学it
fb_123455 小时前
Linux磁盘分区从入门到实操:MBR_GPT全解析+分区工具实战指南
java·linux·gpt
深念Y5 小时前
随身WiFi设备记录
linux·嵌入式·无线·射频·随身wifi·zte
咸鱼翻身小阿橙5 小时前
现在这个四通道出现的问题
学习
柒号华仔6 小时前
【LINUX】Linux从闹钟到高精度定时器的实现
linux