select多人聊天

head.h
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/socket.h>
#include<fcntl.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<errno.h>
#include<string.h>
#include<sqlite3.h>
#include<sys/types.h>
#include<sys/time.h>
#include<pthread.h>
server4.c
#include"head.h"
#ifndef FD_SETSIZE
#define FD_SETSIZE 256
#endif
#define PORT 12345
#define SA struct sockaddr *
char buf[1024];
int main()
{
        int clifd[FD_SETSIZE];
        int listenfd,sockfd;
        int maxfd,maxindex;
        int numfd;
        socklen_t addrlen;
        struct sockaddr_in seraddr,cliaddr;
        fd_set allset;
        fd_set set;
        listenfd=socket(AF_INET,SOCK_STREAM,0);
        seraddr.sin_family=AF_INET;
        seraddr.sin_port=htons(PORT);
        seraddr.sin_addr.s_addr=htonl(INADDR_ANY);
        bind(listenfd,(SA)&seraddr,sizeof(seraddr));
        listen(listenfd,10);
        int i;
        for(i=0;i<FD_SETSIZE;++i)
                clifd[i]=-1;
        FD_SET(listenfd,&allset);
        maxfd=listenfd;
        maxindex=-1;
        while(1)
        {
                set=allset;
                addrlen=sizeof(seraddr);
                numfd=select(maxfd+1,&set,NULL,NULL,NULL);
                if(FD_ISSET(listenfd,&set))
                {
                        sockfd=accept(listenfd,(SA)&cliaddr,&addrlen);
                        for(i=0;i<FD_SETSIZE;++i)
                        {
                                if(clifd[i]<0)
                                {
                                        clifd[i]=sockfd;
                                        break;
                                }
                        }
                        printf("%s connected   i=%d\n",inet_ntoa(cliaddr.sin_addr),clifd[i]);
                        FD_CLR(listenfd,&set);
                        FD_SET(sockfd,&allset);
                        if(sockfd>maxfd)
                                maxfd=sockfd;
                        if(maxindex<i)
                                maxindex=i;
                }
                for(i=0;i<FD_SETSIZE;++i)
                {
                        if(FD_ISSET(clifd[i],&set))
                        {
                                memset(buf,0,sizeof(buf));
                                int rn=read(clifd[i],buf,1024);
                                if(rn<=0)
                                {
                                                                       close(clifd[i]);
                                        printf("id is %d end\n",clifd[i]);
                                        clifd[i]=-1;
                                }
                                else
                                {
                                        printf("%s",buf);
                                        int j;
                                        for(j=0;j<FD_SETSIZE;++j)
                                        {
                                                if(clifd[j]>0 && clifd[i]!=clifd[j])
                                                        write(clifd[j],buf,rn);
                                        }
                                }
                        }
                }



        }
        for(i=0;i<FD_SETSIZE;++i)
                close(clifd[i]);
        close(listenfd);
}
 
                                

client4.c

#include"head.h"
#define PORT 12345
#define SA struct sockaddr *
#define MAXLEN 1024
char re[MAXLEN];
char se[MAXLEN];

void* input(int *aa)
{
        int fd=*aa;
        int num;
        while((num=read(STDIN_FILENO,se,MAXLEN)))
        {
                //printf("%s",se);
                write(fd,se,num);
                memset(se,0,MAXLEN);
        }
}
int main()
{
        struct sockaddr_in seraddr;
        seraddr.sin_family=AF_INET;
        seraddr.sin_addr.s_addr=inet_addr("127.0.0.1");
        seraddr.sin_port=htons(PORT);
        int fd;
        fd=socket(AF_INET,SOCK_STREAM,0);
        //printf("5");
        connect(fd,(SA)&seraddr,sizeof(seraddr));
        //printf("3");
        pthread_t pid;
        pthread_create(&pid,NULL,(void *)input,(void *)&fd);
        while(1)
        {
                memset(re,0,MAXLEN);
                int num=read(fd,re,MAXLEN);
                if(num<=0)
                {
                        close(fd);
                        break;
                }
                else
                        printf("%s",re);
        }
        return 0;

}

编写了一个多人聊天室,练习一下select模型,这个程序还有些小问题,以后慢慢改进。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值