select源码

服务端

复制代码
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<strings.h>
#include<sys/select.h>
#include<sys/time.h>

#define PORT    9487    
#define LISTEN_NUM    5

#define BUFFER_SIZE    1024

int init_server_fd(int *fd);
void select_demo();

int main()
{
    select_demo();
    return 0;
}

void select_demo()
{
    printf("select demo\n");
    
    int server_fd;
    int client_fd[10];
    int ret;
    int maxfd;
    int i;
    char buf[BUFFER_SIZE];
    struct timeval timeout;

    fd_set rfds, allfds;

    init_server_fd(&server_fd);

    printf("server_fd created :%d\n", server_fd);

    FD_ZERO(&rfds);
    FD_ZERO(&allfds);
    FD_SET(server_fd, &allfds);
    maxfd = server_fd + 1;

    ret = FD_ISSET(server_fd, &allfds);
    printf("ret :%d\n", ret);

    for(i = 0; i < 10; i++)
    {
        client_fd[i] = -1;
    }

    for(;;)
    {
        timeout.tv_sec  = 5;
        timeout.tv_usec = 0;
        rfds = allfds;
        ret = FD_ISSET(server_fd, &rfds);
        printf("ret :%d\n", ret);
        printf("maxfd :%d\n", maxfd);
        printf("time :%ld.%ld\n", timeout.tv_sec, timeout.tv_usec);
        ret = FD_ISSET(4, &rfds);
        printf("4 ret :%d\n", ret);

        ret = select(maxfd, &rfds, NULL, NULL, &timeout);
        if(ret == 0)
        {
            printf("timeout\n");
            continue;
        }
        if(ret < 0)
        {
            return;
        }
        else
        {
            printf("ret > 1\n");
            if(FD_ISSET(server_fd, &rfds))
            {
                for(i=0;i<10;i++)
                {
                    if(client_fd[i] != -1)
                        continue;

                    struct sockaddr_in client_addr;
                    socklen_t client_addr_len;

                    client_fd[i] = accept(server_fd, (struct sockaddr *)&client_addr, &client_addr_len);
                    printf("client_fd :%d\n",client_fd[i]);
                    FD_SET(client_fd[i], &allfds);
                    if(client_fd[i] >= maxfd)
                    {
                        maxfd = client_fd[i] + 1;
                    }
                    printf("set maxfd :%d\n", maxfd);
                    
                    if(FD_ISSET(client_fd[i], &allfds))
                        printf("set client fd %d to allfds\n", client_fd[i]);
                    break;
                }
            }
            else 
            {
                printf("enter other\n");
                for(i=0; i< 10; i++)
                {
                    if(client_fd[i] == -1)
                        continue;
                    printf("client_fd[%d] :%d\n", i, client_fd[i]);

                    if(FD_ISSET(client_fd[i], &rfds))
                    {
                        ret = recv(client_fd[i], buf, sizeof(buf), 0);
                        printf("recv :%s\n", buf);
                        close(client_fd[i]);
                        FD_CLR(client_fd[i], &allfds);
                    }
                }
            }
        }
    }
    close(server_fd);

}

int init_server_fd(int *fd)
{
    int ret;
    struct sockaddr_in server_addr;

    //init server_addr
    bzero(&server_addr,sizeof(server_addr));
    server_addr.sin_family     = AF_INET;
    server_addr.sin_port    = htons(PORT);
    server_addr.sin_addr.s_addr = INADDR_ANY;
    *fd = socket(AF_INET, SOCK_STREAM, 0);

    ret = bind(*fd, (struct sockaddr *)&server_addr, sizeof(server_addr));

    ret = listen(*fd, LISTEN_NUM);

    return ret;
}
复制代码

 

客户端

复制代码
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <strings.h>
#include <sys/types.h>
#include <string.h>
#include <stdlib.h>

#if 0
#define IPADDR "10.0.0.51"    //本地服务器地址
#define PORT 9487            //本地服务器端口
#else
#define IPADDR "127.0.0.1"    //服务器地址
#define PORT 9487        //服务器端口
#endif  

#define BUFFER_SIZE 4096

int main()
{
    int sockfd;
    struct sockaddr_in servaddr;
    char send_buf[BUFFER_SIZE], recv_buf[BUFFER_SIZE];

    //初始化网络连接结构体
    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(PORT);
    if(inet_pton(AF_INET, IPADDR, &servaddr.sin_addr) <= 0)
    {
        perror("Error: ");
        exit(0);    
    }

    //创建socket
    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        perror("Error: ");
        exit(0);    
    }
    //连接
    if(connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
    {
        perror("Error: ");
        exit(0);    
    }

    printf("已成功与服务器建立了连接...\n");

    memset(send_buf, 0, sizeof(send_buf));
    scanf("%s", send_buf);

    //strcat(send_buf, "hello server");

    if(send(sockfd, send_buf, strlen(send_buf), 0) < 0)
    {
        perror("Error: ");    
        exit(0);
    }
    else
    {
        printf("send buf successful\n");
    }
    
    memset(recv_buf, 0, sizeof(recv_buf));
    recv(sockfd, recv_buf, sizeof(recv_buf) - 1, 0);
    printf("\n%s\n", recv_buf);

    close(sockfd);

    return 0;    
}
复制代码

 

posted @   roverqqq  阅读(68)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示