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


1 IPV4套接字结构体

在这里插入图片描述

2 TCP客户端

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

tcp是打电话的模型,建立连接 使用连接 关闭连接
1.创建套接字api

函数

在这里插入图片描述
在这里插入图片描述

3 TCP服务器

在这里插入图片描述
比客户端多两个
bind 绑定端口号,
accpet 监听端口号

流程

1.创建套接字 socket
在这里插入图片描述
2.给套接字绑定端口和ip bind
在这里插入图片描述
3.进行监听 listen
将套接字由主动转换为被动
创建一个链接队列
在这里插入图片描述

4.提取链接 accept
从已完成链接队列提取链接
提取链接得到一个已连接的套接字,接下来用这个已连接的套接字和客户端通信
5.进行读写
6.关闭fd

在这里插入图片描述

函数

在这里插入图片描述
`在这里插入图片描述
在这里插入图片描述

代码

#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报文,报文中会携带当前缓冲区大小
在这里插入图片描述
在这里插入图片描述

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值