server.cpp
#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
using namespace std;
int main()
{
struct sockaddr_in serveraddr ;
memset((void*)&serveraddr,0,sizeof(serveraddr)) ;
serveraddr.sin_family = AF_INET ;
serveraddr.sin_port = htons(9000) ;
serveraddr.sin_addr.s_addr = 0 ;
int sockfd = socket(AF_INET , SOCK_STREAM , 0) ;
bind(sockfd, (struct sockaddr*)&serveraddr , sizeof(serveraddr)) ;
listen(sockfd, 20) ;
fd_set client_fdset ;
fd_set client_fdset_test ;
int maxsock = sockfd ;
int client_sockfd[20] ;
memset(client_sockfd,0,sizeof(int)*20) ;
FD_ZERO(&client_fdset) ;
FD_SET(sockfd , &client_fdset) ;
char readbuf[1000] ;
while(1){
memcpy(&client_fdset_test , &client_fdset, sizeof(fd_set)) ;
select(maxsock+1 , &client_fdset_test, NULL,NULL,NULL ) ;
if(FD_ISSET(sockfd, &client_fdset_test)){
int newsockfd = accept(sockfd,NULL,NULL) ;
if(newsockfd > maxsock) maxsock = newsockfd ;
FD_SET(newsockfd,&client_fdset) ;
for (int i = 0; i < 20; i++) {
if(!client_sockfd[i]) {
client_sockfd[i] = newsockfd ;
break ;
}
}
}else{
for (int i = 0; i < 20; i++) {
cout << client_sockfd[i] << " " ;
if(client_sockfd[i] &&
FD_ISSET(client_sockfd[i], &client_fdset_test)){
int read_len = read(client_sockfd[i], readbuf,1000) ;
readbuf[read_len] = 0 ;
cout << "socket " << client_sockfd[i] <<" recv : "
<< readbuf << endl ;
}
}
}
}
return 0;
}