Webserver(4.3)TCP通信实现

目录

服务器端

cpp 复制代码
#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=AF_INET;
    //indet_pton(AF_INET,"192.168.227.129",saddr.sin_addr.s_addr);
    saddr.sin_addr.s_addr=INADDR_ANY;
    saddr.sin_port=htons(9999);
    int ret=bind(lfd,(struct sockaddr *)&saddr,sizeof(saddr));
    if(ret==-1){
        perror("bind");
        exit(0);
    }

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

    //4.接收客户端的连接
    struct sockaddr_in clientaddr;
    socklen_t len=sizeof(clientaddr);
    int cfd=accept(lfd,(struct sockaddr *)&clientaddr,&len);
    if(cfd==-1){
        perror("accept");
        exit(0);
    }

    //输出客户端的信息
    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,port is %d\n",clientIP,clientPort);

    //5.通信
    char recvBuf[1024]={0};
    //获取客户端的数据
    while(1){
        
        int num=read(cfd,recvBuf,sizeof(recvBuf));
        if(num==-1){
            perror("read");
            exit(-1);
        }else if(num>0){
            printf("recv client data:%s\n",recvBuf);
        }else if(num==0){
            //表示客户端断开连接
            printf("client closed...");
            break;
        }

        char * data="hello,i am server";
        //给客户端发送数据
        write(cfd,data,strlen(data));
    }
    

    //关闭文件描述符
    close(cfd);
    close(lfd);

    return 0;
}

客户端

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

int main(){

    //1.创建套接字
    int fd=socket(AF_INET,SOCK_STREAM,0);
    if(fd==-1){
        perror("socket");
        exit(-1);
    }

    //2.连接服务器端
    struct sockaddr_in serveraddr;
    serveraddr.sin_family=AF_INET;
    inet_pton(AF_INET,"192.168.227.129",&serveraddr.sin_addr.s_addr);
    serveraddr.sin_port=htons(9999);
    int ret=connect(fd,(struct sockaddr *)&serveraddr,sizeof(serveraddr));
    if(ret==-1){
        perror("connect");
        exit(-1);
    }

    char recvBuf[1024]={0};
    //3.通信
    while(1){
         char * data="hello,i am client";
        //给服务器发送数据
        write(fd,data,strlen(data));
        sleep(1);
        
        int len=read(fd,recvBuf,sizeof(recvBuf));
        if(len==-1){
            perror("read");
            exit(-1);
        }else if(len>0){
            printf("recv server data:%s\n",recvBuf);
        }else if(len==0){
            //表示客户端断开连接
            printf("server closed...");
        }
    }
   

    //关闭连接
    close(fd);



    return 0;
}


加上循环就是一直发送

TCP三次握手

三次握手发生在客户端连接的时候,在connect()函数调用时

滑动窗口

窗口理解为缓冲区的大小,滑动窗口的大小会随着发送数据和接收数据而变化。

通信的双方都有发送缓冲区和接收数据的缓冲区

TCP四次挥手

四次挥手发生在断开连接的时候,在程序中调用close()会使用TCP协议进行四次挥手。

客户端和服务器端都可以主动发起断开连接,和连接的时候不一样(客户端主动)

因为三次握手建立的连接是双向的,在断开的时候需要双向断开

相关推荐
吴阿福|一人公司6 分钟前
深度解析 Python 类变量修改的命名空间隔离
java·服务器·数据结构
qq36219670519 分钟前
第三方安卓应用商店安全评测 2026:Appteka、Aptoide、APKPure 等 7 家横评
android·网络·人工智能·安全·chatgpt·智能手机
AI科技星21 分钟前
数术工坊・八卷全书【本源创世终极版・万世定稿】
开发语言·网络·量子计算·拓扑学
土星云SaturnCloud31 分钟前
从云端到边缘:电子装配线AI视频分析在土星云SE110S-WA32上的落地实践
服务器·人工智能·ai·边缘计算
AI科技星35 分钟前
数术工坊・八卷全书(番外・实战升华副卷)【终极典藏定稿|完整无删减】
c语言·开发语言·网络·量子计算·agi
DreamLife☼36 分钟前
OpenBCI-脑电信号的隐私与安全保护
网络·安全·开源硬件·脑机接口·eeg·openbci·神经科技
宇晨T37 分钟前
BurpSuite实战:WackoPicko敏感目录探测
linux·运维·服务器
yyuuuzz37 分钟前
云服务器软件部署的几个常见问题
运维·服务器·开发语言·网络·云计算·php·apache
dust_and_stars39 分钟前
为什么ubuntu24 snap install code-server 不需要--classic?
网络·数据库
BomanGe243 分钟前
NSK W1406FA系列长行程高速精密丝杠技术指南
运维·服务器·数据库·经验分享·规格说明书