使用多路复用实现一个服务器与多个客户端的通信:代码范例:
服务器:
#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;
}
}