网络编程-IO模型 多路复用使用例子

问题:实现客户端与服务器的双向通信 一般需要开启两个线程 两个while循环实现

使用多路复用即可解决这个问题 减少系统资源的使用

#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>
/* According to POSIX.1-2001, POSIX.1-2008 */
#include <sys/select.h>

/* According to earlier standards */
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char const *argv[])
{
    // 1.创建
    int tcp_socket = socket(AF_INET, SOCK_STREAM, 0);

    // 2.设置服务器地址
    struct sockaddr_in ser_addr;
    ser_addr.sin_family = AF_INET;         // IPV4
    ser_addr.sin_port = htons(6667);       //采用大端序
    ser_addr.sin_addr.s_addr = inet_addr("192.168.0.105"); //自动绑定本地网卡地址

    int ret = connect(tcp_socket, (struct sockaddr *)&ser_addr, sizeof(ser_addr));


    // 4.接收链接请求

    while (1)
    {
        // 设置套接字集合,并清零
        fd_set set;

        FD_ZERO(&set); // 清零

        FD_SET(tcp_socket, &set);//网络描述符
        FD_SET(0, &set);//标准输入设备


        printf("开始selec检测\n");

        // 调用select(),同时多路监控以上三种阻塞状态
        ret = select(tcp_socket + 1, &set, NULL, NULL, NULL);

        if (ret < 0)
        {
            perror("");
        }else{
            printf("有活跃描述符\n");
        }

        //抓出活跃的描述符
        if(FD_ISSET(tcp_socket, &set))
        {
            printf("网络 socket 活跃\n");

            char buf[1024] = {0};
            read(tcp_socket,buf,1024);
            printf("%s\n",buf);

        }

        if(FD_ISSET(0, &set))//标准输入
        {
            printf("标准输入 活跃\n");

            char buf[1024] = {0};
            scanf("%s", buf);
            write(tcp_socket, buf , strlen(buf));

        }
    }

    

    return 0;
}

效果:

猜你喜欢

转载自blog.csdn.net/aaa2540567665/article/details/126465995