Skip to content

Latest commit

 

History

History
232 lines (186 loc) · 5.26 KB

15.md

File metadata and controls

232 lines (186 loc) · 5.26 KB

第15节 C语言套接字通信

❤️💕💕计算机网络--TCP/IP 学习。Myblog:http://nsddd.top


[TOC]

select

/*************************************************************************
    > File Name: c.c
    > Author: smile
    > Mail: [email protected] 
    > Created Time: Wed 20 Jul 2022 12:36:56 AM PDT
 ************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>

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

    //2. 绑定本地的IP,port
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(10000);   //转化为大端 -- 后面是指定的端口(不能被占用一般5000以上)

    addr.sin_addr.s_addr = INADDR_ANY;  //宏对应ip0:0.0.0.0可以绑定本地任意一个地址

    int ret = bind(fd, (struct sockaddr*)&addr, sizeof(addr));
    if(ret == -1)
    {
        perror("bind");
        exit(0);
        //return -1;
    }

    //3. 设置监听
    ret = listen(fd, 128);  //最大连接数:128
    if(ret == -1)
    {
        perror("listen");
        exit(0);
        //return -1;
    }

    
    //4. 阻塞并等待客户端的连接
    struct sockaddr_in cliaddr;  //创建addr_in结构体方便更好的取出数据
    int clilen = sizeof(cliaddr);  //强制转换
    int cfd = accept(fd, (struct sockaddr*)&cliaddr, &clilen);
    if(cfd == -1)
    {
        perror("accept");
        exit(0);
        //return -1;
    }

    //连接建立成功,打印客户端的IP和端口
    char ip[24] = {0};
    printf("客户端的IP地址: %s, 端口: %d\n",
           inet_ntop(AF_INET, &cliaddr.sin_addr.s_addr, ip, sizeof(ip)),
           ntohs(cliaddr.sin_port));
    
    //5. 通信
    while(1)
    {

        char buf[1024];   //数据存放
        memset(buf, 0, sizeof(buf));
        int len = read(cfd, buf, sizeof(buf)); //四个参数 - end = 0
        if(len > 0)   //接收数据
        {
            printf("客户端say: %s\n", buf);
            write(cfd, buf, len);
        }
        else if(len  == 0)
        {
            printf("客户端断开了连接...\n");
            break;
        }
        else
        {
            perror("read"); //打印错误信息
            break;
        }
    }

    //关闭文件描述符 -- 通信的和表述的
    close(cfd);
    close(fd);

    return 0;
}

client

/*************************************************************************
    > File Name: s.c
    > Author: smile
    > Mail: [email protected] 
    > Created Time: Wed 20 Jul 2022 01:32:10 AM PDT
 ************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>

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

    //2. connect连接服务器IP prot
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(10000);   //客户端需要连接到的服务器端口
    //addr.sin_addr.s_addr = INADDR_ANY; //0 = 0.0.0.0  绑定网卡真实的ip地址
    inet_pton(AF_INET, "192.168.137.128", &addr.sin_addr.s_addr);   //转换的大端IP

    int ret = connect(fd, (struct sockaddr*)&addr, sizeof(addr));
    if(ret == -1)
    {
        perror("connect");
        exit(0);
        //return -1;
    }

    
    int number = 0;   //记录发送的数据个数
    while(1)
    {
        //发送数据
        char buf[1024];
        sprintf(buf, "你好, 服务器...%d\n", number++); 
        write(fd, buf, strlen(buf)+1);  //strlen计算buf里面实际的字节数--不包含最后\n

        //接收数据
        memset(buf, 0, sizeof(buf));
        int len = read(fd, buf, sizeof(buf));
        if(len > 0)
        {
            printf("服务器say: %s\n", buf);
        }
        else if(len  == 0)
        {
            printf("服务器断开了连接...\n");
            break;
        }
        else
        {
            perror("read");
            break;
        }
        sleep(1); //客户端发数据的时候发慢一点  
    }

    close(fd);
    return 0;
}

测试

select

root@ubuntu:/c/c-s# gcc -o client client.c 
root@ubuntu:/c/c-s# gcc -o sever sever.c 
root@ubuntu:/c/c-s# ./sever 
客户端的IP地址: 192.168.137.128, 端口: 57864
客户端say: 你好, 服务器...0

客户端say: 你好, 服务器...1

客户端say: 你好, 服务器...2

客户端say: 你好, 服务器...3

客户端断开了连接...

client

root@ubuntu:/c/c-s# ./client 
服务器say: 你好, 服务器...0

服务器say: 你好, 服务器...1

服务器say: 你好, 服务器...2

服务器say: 你好, 服务器...3

END 链接