• 服务器与多个客户端通信


    使用多路复用实现一个服务器与多个客户端的通信:代码范例:
    服务器:
    #include<stdio.h>
    #include<netinet/in.h>
    #include<stdlib.h>
    #include<string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include<pthread.h>
    #include<strings.h>
    
    void send1(int *a)
    {
        int i;
        char buf[20];
        bzero(buf,20);
        fgets(buf,20,stdin);
        for(i=0;i<12;i++)
        {    if(a[i] !=0)
            send(a[i],buf,20,0);
        }
    }
    int main()
    {
        int fds[12]={0};
        int maxfd = -1;
        int socketfd = socket(PF_INET,SOCK_STREAM,0);
        if(socketfd>maxfd)
            maxfd = socketfd;
        struct sockaddr_in saddr;
        memset(&saddr,0,sizeof(saddr));
        saddr.sin_family = PF_INET;
        saddr.sin_port = htons(6000);
        saddr.sin_addr.s_addr = inet_addr("192.168.1.46");
        int newsocketfd;
        int n = 1;
        setsockopt(socketfd, SOL_SOCKET, SO_REUSEADDR, &n, sizeof(int));
        if(bind(socketfd,(struct sockaddr*)&saddr,sizeof(struct sockaddr_in))<0)
            perror("bind() error!
    ");
        
        if(listen(socketfd,5)<0)
            perror("listen() error!
    ");
        struct sockaddr_in caddr;
        int s = sizeof(struct sockaddr);
    //    newsocketfd = accept(socketfd,(struct sockaddr*)&caddr,&s);
        fd_set fd;
        FD_ZERO(&fd);
        int ret;
        char buf[20],buf1[20];
        int i;
        int rsize;
        while(1)
        {    
            FD_ZERO(&fd);
            FD_SET(0,&fd);    
            FD_SET(socketfd,&fd);
            for(i=0;i<12;i++)
            {
        //    printf("--------------
    ");        
                if(fds[i]!=0)
                FD_SET(fds[i],&fd);
            }
            ret = select(maxfd+1,&fd,NULL,NULL,NULL);
            if(ret<0)
            {
                perror("select() error!
    ");
                break;
            }
            else if(ret ==0)
            {
                continue;
            }
            else
            {
                if(FD_ISSET(socketfd,&fd))
                {
                    newsocketfd = accept(socketfd,(struct sockaddr*)&caddr,&s);
                if(newsocketfd>maxfd)
                {
        //    printf("--------------
    ");        
                    maxfd = newsocketfd;
                    for(i=0;i<12;i++)
                    {
                        if(fds[i]==0)
                        {
                            fds[i] = newsocketfd;
                            break;
                        }
                    }
                        
                }
                continue;
                }
    //            printf("helo
    ");
                for(i=0;i<12;i++)
                {
                    if(fds[i] !=0 && FD_ISSET(fds[i],&fd))
                    {
                        bzero(buf1,20);
                        if(recv(fds[i],buf1,20,0)==0)
                        {
                            close(fds[i]);
                            fds[i] = 0;
                        }
                        printf("%s",buf1);    
                    }
                }
                    if(FD_ISSET(0,&fd))
                    {
                        send1(fds);
                    }
        }
        }
        close(socketfd);
        close(newsocketfd);
    
    }
    客户端:
    #include<stdio.h>
    #include<pthread.h>
    #include<netinet/in.h>
    #include<stdlib.h>
    #include<string.h>
    #include<strings.h>
    #include<sys/types.h>
    #include<sys/socket.h>
    int main()
    {
        int socketfd,ret;
        fd_set fd;
        FD_ZERO(&fd);
        FD_SET(0,&fd);
            
        
        socketfd = socket(PF_INET,SOCK_STREAM,0);
        FD_SET(socketfd,&fd);
        ret = select(socketfd+1,&fd,NULL,NULL,NULL);
        struct sockaddr_in saddr;
        memset(&saddr,0,sizeof(saddr));
        saddr.sin_family = PF_INET;
        saddr.sin_port = htons(6000);
        saddr.sin_addr.s_addr = inet_addr("192.168.1.46");
        
        if(connect(socketfd,(struct sockaddr *)&saddr,sizeof(struct sockaddr))<0)
    
            perror("connect() error!
    ");
    //    pthread_t pthreadid;
    //    pthread_create(&pthreadid,NULL,func,NULL);
        char buf[20],buf1[20];
        while(1)
        {
            bzero(buf,20);
            bzero(buf1,20);
            
        FD_SET(0,&fd);
        FD_SET(socketfd,&fd);
        ret = select(socketfd+1,&fd,NULL,NULL,NULL);
                if(FD_ISSET(socketfd,&fd))
                {
                if(recv(socketfd,buf1,sizeof(buf1),0)<0)
                    perror("recv() error!
    ");
                    printf("%s",buf1);
                    continue;
                }
                if(FD_ISSET(0,&fd))
                {
                fgets(buf,20,stdin);    
                if(send(socketfd,buf,strlen(buf),0)<0)
                perror("send() error!
    ");
                continue;
                }    
    
            }
  • 相关阅读:
    git 一般的使用操作
    php 导出excel,csv
    安装sublime_text_3
    安装mongodb记录,mongo基本命令记录
    redis 安装记录
    YII2 activeform样式修改
    go 安装下载
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.hbsjz/com.hbsjz.BaseMapActivity}:
    SQLServer创建触发器,更新表
    SQL Server触发器创建、删除、修改、查看示例步骤
  • 原文地址:https://www.cnblogs.com/defen/p/5287678.html
Copyright © 2020-2023  润新知