【项目 计网5】 4.15 TCP通信实现(服务器端)4.16 TCP通信实现(客户端)

文章目录

    • 4.15 TCP通信实现(服务器端)
    • 4.16 TCP通信实现(客户端)


4.15 TCP通信实现(服务器端)

// TCP 通信的服务器端

// TCP 通信的服务器端
#include 
#include 
#include 
#include 
#include 

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; //协议族
    //把点分十进制IP地址转换成int 而且是网络字节序的
    //saddr->sin_addr.s_addr 本质是一个长整型的变量  结构体套结构体
    //第三个参数是传出参数,也就是转换好的void* 直接就给了saddr->sin_addr.s_addr
    inet_pton(AF_INET,"192.168.65.129",&saddr.sin_addr.s_addr); //p:point 点分十进制
    
    /*
     saddr->sin_addr.s_addr = 0; 
     saddr->sin_addr.s_addr = INADDR_ANY;  INADDR_ANY这个宏就是0
     0.0.0.0  表示任意地址 比如一台主机有两个网卡,两个都绑定
     客户端无论用哪一个IP地址 都可以访问到这台主机
    */
    //saddr->sin_port = 9999; 这是主机字节序的9999 要转成网络字节序
    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);
    }

    //打印客户端信息
    //把获取到的网络字节序IP和端口转换成主机字节序
    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};
    len = read(cfd,recvBuf,sizeof(recvBuf));
    if(len == -1){
        perror("accept");
        exit(0);
    }else if(len > 0){
        printf("recv client data = %s\n",recvBuf);
    }else if(len == 0){
        //表示客户端关闭连接
        printf("client close...");
    }
    //给客户端发送数据
    char* data = "hello,i am server";
    write(cfd,data,strlen(data));

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

    return 0;
}

4.16 TCP通信实现(客户端)

// TCP 通信的服务器端
#include 
#include 
#include 
#include 
#include 

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; //协议族
    //把点分十进制IP地址转换成int 而且是网络字节序的
    //saddr->sin_addr.s_addr 本质是一个长整型的变量  结构体套结构体
    //第三个参数是传出参数,也就是转换好的void* 直接就给了saddr->sin_addr.s_addr
    inet_pton(AF_INET,"192.168.65.129",&saddr.sin_addr.s_addr); //p:point 点分十进制
    
    /*
     saddr->sin_addr.s_addr = 0; 
     saddr->sin_addr.s_addr = INADDR_ANY;  INADDR_ANY这个宏就是0
     0.0.0.0  表示任意地址 比如一台主机有两个网卡,两个都绑定
     客户端无论用哪一个IP地址 都可以访问到这台主机
    */
    //saddr->sin_port = 9999; 这是主机字节序的9999 要转成网络字节序
    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);
    }

    //打印客户端信息
    //把获取到的网络字节序IP和端口转换成主机字节序
    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};
    len = read(cfd,recvBuf,sizeof(recvBuf));
    if(len == -1){
        perror("accept");
        exit(0);
    }else if(len > 0){
        printf("recv client data = %s\n",recvBuf);
    }else if(len == 0){
        //表示客户端关闭连接
        printf("client close...");
    }
    //给客户端发送数据
    char* data = "hello,i am server";
    write(cfd,data,strlen(data));

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

    return 0;
}

你可能感兴趣的:(tcp/ip,php,服务器)