Linux TCP协议通信 (流程 三次握手 四次挥手 滑动窗口)

TCP通信流程

Socket函数

TCP通信实现(服务器端)

#include <stdio.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main() {
    //1.创建socket
    int lfd = socket(AF_INET, SOCK_STREAM, 0);
    if(lfd == -1) {
        perror("socket");
        exit(0);
    }
    //2.绑定
    struct sockaddr_in saddr;
    saddr.sin_family = PF_INET;
    inet_pton(AF_INET, "192.168.245.129", &saddr.sin_addr.s_addr);
    saddr.sin_port = htons(9999);
    int ret = bind(lfd, (struct sockaddr*)&saddr, sizeof(saddr));
    if(ret == -1) {
        perror("bind");
        return 0;
    }

    //3.监听
    ret = listen(lfd, 8);
    if(ret == -1) {
        perror("listen");
        return 0;
    }

    //4.接受
    struct sockaddr_in clientaddr;
    int len = sizeof(clientaddr);
    int cfd = accept(lfd, (struct sockaddr*)&clientaddr, &len);
    if(cfd == -1) {
        perror("accept");
        return -1;
    }

    //输出客户端的信息
    char clientIP[16];
    inet_ntop(AF_INET, &clientaddr.sin_addr.s_addr, clientIP, sizeof(clientIP));
    unsigned short clientPort = ntohs(clientaddr.sin_port);
    printf("client ip is %s, client port is %d\n", clientIP, clientPort);

    //5.获取客户端数据 
    while(1) {
        char receiveBuf[1024] = {0};
        int llen = read(cfd, receiveBuf, sizeof(receiveBuf));
        if(llen == -1) {
            perror("read");
            exit(0);
        } else if(llen > 0) {
            printf("receive client data: %s\n", receiveBuf);
        } else if (llen == 0) {
            printf("client closed...");
            break;
        }

        //给客户端发送数据
        char * data = "hello, i`m server";
        write(cfd, data, strlen(data));
    }
    //关闭文件描述符
    close(cfd);
    close(lfd);
}

TCP通信实现(客户端)

#include <stdio.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main() {
    //创建套接字
    int lfd = socket(AF_INET, SOCK_STREAM, 0);
    if(lfd == -1) {
        perror("socket");
        exit(-1);
    }
    //连接服务器
    struct sockaddr_in serveraddr;
    inet_pton(AF_INET, "192.168.245.129", &serveraddr.sin_addr.s_addr);
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(9999);
    int ret = connect(lfd, (struct sockaddr *) &serveraddr, sizeof(serveraddr));
    if(ret == -1) {
        perror("connect");
        _exit(-1);
    }
    //通信
    while(1) {
        char * data = "hello, i`m client";
        write(lfd, data, strlen(data));
        char receiveBuf[1024] = {0};
        int len = read(lfd, receiveBuf, sizeof(receiveBuf));
        if(len == -1) {
            perror("read");
            exit(0);
        } else if(len > 0) {
            printf("receive server data: %s\n", receiveBuf);
        } else if (len == 0) {
            printf("server closed...");
        }
    }
    

    close(lfd);
}

TCP三次握手

TCP滑动窗口

TCP四次挥手

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值