基于select模型的server

前面一篇介绍了IO模型。其中重点介绍了IO多路转接中的三种模型,包括了select,poll,epoll三种。下面就是基于select模型编写的服务器与客户机,两者可以进行交互。

 

基于select模型的server_第1张图片

服务器端代码:k

#include
#include
#include
#include
#include
#include
#include
#include

int fdArray[sizeof(fd_set)*8];
int startup(int port)
{
    int sock = socket(AF_INET,SOCK_STREAM,0);
    if(sock<0){
        perror("socket");
        exit(2);
    }
    //为了防止服务器主动断开连接,无法连接重启的问题
    int opt = 1;
    setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));

    struct sockaddr_in local;
    local.sin_family = AF_INET;
    local.sin_addr.s_addr = htonl(INADDR_ANY);
    local.sin_port = htons(port);
    if(bind(sock,(struct sockaddr*)&local,sizeof(local))<0)
    {
        perror("bind");
        exit(3);
    }
    if(listen(sock,5)<0)
    {
        perror("listen");
        exit(4);
    }
    return sock;
}
// ./select_server 8080
int main(int argc,char* argv[])
{
    if(argc!=2)
    {
        printf("Usage: %s port\n",argv[0]);
        return 1;
    }
    int listen_sock = startup(atoi(argv[1]));
    //已经创建listen_sock   
    fdArray[0] = listen_sock;//合法的描述符
    int num = sizeof(fdArray)/sizeof(fdArray[0]);
    int i = 1;
    for(i;i=0)
            {
                //这就是合法的描述符
                FD_SET(fdArray[i],&rfds);
                if(max

基于select模型的server_第2张图片

 

客户端代码:

#include
#include
#include
#include
#include
#include

int main(int argc,char* argv[])
{
    if(argc!=2)
    {
        printf("Usage :./select_client [port]");
        return 1;
    }

    //
    struct sockaddr_in client;
    client.sin_port = htons(atoi(argv[1]));
    client.sin_family = AF_INET;
    client.sin_addr.s_addr = htonl(INADDR_ANY);
    //创建套接字
    int sock = socket(AF_INET,SOCK_STREAM,0);
    if(sock<0)
    {
        perror("socket");
        return 1;
    }
    //连接服务器
    if(connect(sock,(struct sockaddr*)&client,sizeof(client))<0)
    {
        perror("connect");
        return 1;
    }
    for(;;)
    {
        //输入消息并刷新缓冲区
        printf("client >");
        fflush(stdout);
        //将消息读到buf里
        char buf[1024] = {0};
        read(0,buf,sizeof(buf)-1);
        //将消息写给文件描述符
        if(write(sock,buf,strlen(buf))<0){
            perror("write");
            continue;
        }
        //将服务器返回的消息写到buf里   
        int ret = read(sock,buf,sizeof(buf)-1);
        if(ret<0){
            perror("read");
            continue;
        }
        if(ret==0)
        {
            printf("server close\n");
            break;
        }
        printf("server:%s\n",buf);
    }
    close(sock);
    return 0;
}

这样通过客户端与服务器的交互就可以互通消息了。

你可能感兴趣的:(Linux&网络)