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模型,这个程序还有些小问题,以后慢慢改进。