io模型-poll函数应用

运行1个服务器和2个客户端

        实现效果:

                服务器和2个客户端互相聊天,服务器和客户端都需要使用select模型去实现

                服务器要监视2个客户端是否连接,2个客户端是否发来消息以及服务器自己的标准输入流

                客户端要监视服务器是否发来消息以及客户端自己的标准输入流 在不开线程的情况下,实现互相聊天

pollser.c

#include 
 
#define SER_PORT 6666           //服务器端口号
#define SER_IP "127.0.0.1"      //服务器地址
 
int find_client(int *client_arr, int len, int client)//找到client所在位置
{
    for(int i=0; i

pollcli.c

#include 
 
#define SER_PORT 6666
#define SER_IP "127.0.0.1"
 
int main(int argc, char const *argv[])
{
    int cfd = socket(AF_INET, SOCK_STREAM, 0);
    if(cfd == -1)
    {
        perror("socket error");
        return -1;
    }
    printf("socket success\n");
 
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(SER_PORT);
    sin.sin_addr.s_addr = inet_addr(SER_IP);
 
    if(connect(cfd, (struct sockaddr *)&sin, sizeof(sin)) == -1)
    {
        perror("connect error");
        return -1;
    }
    printf("connect success\n");
 
    // 定义一个监视列表
    fd_set readfds;
    FD_ZERO(&readfds);
    FD_SET(cfd, &readfds);
    FD_SET(STDIN_FILENO, &readfds);
 
    while(1)
    {
        fd_set temp = readfds;
        select(FD_SETSIZE, &temp, NULL, NULL, 0);
 
        // 标准输入流文件描述符激活
        if(FD_ISSET(STDIN_FILENO, &temp))
        {
            char buf[128] = "";
            int res = read(STDIN_FILENO, buf, sizeof(buf));
            buf[strlen(buf)-1] = 0;
            sendto(cfd, buf, res, 0, (struct sockaddr *)&sin, sizeof(sin));
            if(strcmp(buf, "quit") == 0)
                break;
        }
 
        // 客户端套接字文件描述符激活
        if(FD_ISSET(cfd, &temp))
        {
            char buf[128] = "";
            int res = read(cfd, buf, sizeof(buf));
            printf("服务器:%s\n", buf);
            if(strcmp(buf, "quit") == 0)
                break;
        }
    }
 
    close(cfd);
 
    return 0;
}

你可能感兴趣的:(linux)