#include <SYS types.h>
#include <SYS ioctl.h>
#include <SYS wait.h>
#include <STDIO.H>
#include <SYS socket.h>
#include <ERRNO.H>
#include <STRING.H>
#include <STDLIB.H>
#include <SYS time.h>
#include <UNISTD.H>
#include <NETINET in.h>
#include <SYS un.h>
#define LISTEN_BACKLOGNUM 20
#define MAX_CONNECTED_NUM 20
#define NUM_SOCKFD 10
#define MAX_DATABUFFER_SIZE 200
int main(int argc, char **argv)
{
char strdatabuffer1[MAX_DATABUFFER_SIZE];
//char* strdatabuffer2;
fd_set fdset_readfd;
fd_set fdset_writefd;
fd_set fdset_errorfd;
int nmaxfds;
int hListenSocketfd;
int newclientsocketfd;
unsigned long linit = 0;
int arraysockfd[NUM_SOCKFD];
linit = init_socket_listen(atoi(argv[1]), hListenSocketfd );
if(linit < 0)
exit(0);
printf("server current states is listening...");
FD_ZERO(&fdset_readfd);
FD_ZERO(&fdset_writefd);
FD_SET(hListenSocketfd, &fdset_readfd);
FD_SET(hListenSocketfd, &fdset_writefd);
FD_SET(hListenSocketfd, &fdset_errorfd)
nmaxfds = hListenSocketfd;
while(true)
{
int nselectresult;
for(int ncount = 0; ncount < NUM_SOCKFD; ncount++)
{
if(arraysockfd[ncount] != 0)
{
FD_SET(arraysockfd[ncount], &fdset_readfd );
}
}
timeval.tv_sec = 30;
timeval.tv_usec =0;
nselectresult = select(nmaxfds + 1, &fdset_readfd, &fdset_writefd, &fdset_errorfd, &timeval );
if(nselectresult == -1 && fdset_errorfd == EINTR)
continue;
if(nselectresult < 0)
{
perror("select(nmaxfds + 1, &fdset_readfd, &fdset_writefd, &fdset_errorfd, NULL )");
exit(1);
}
if(FD_ISSET(hListenSocketfd, &fdset_readfd))
{
struct sockaddr_in client_address;
memset (&client_address, 0, sizeof (client_address));
int clienaddrlength = sizeof(client_address);
newclientsocketfd = accept (hListenSocketfd, (struct sockaddr *)&client_address, &clienaddrlength);
for(int i = 0 ; i < NUM_SOCKFD; i++)
{
if(arraysockfd[i] == 0)
{
arraysockfd[i] = newclientsocketfd;
break;
}
}
if(newclientsocketfd > nmaxfds)
nmaxfds = newclientsocketfd;
// if(read(client_fd,buf,MAXDATASIZE)<0){
read(newclientsocketfd, strdatabuffer1, MAX_DATABUFFER_SIZE, 0);
printf("receive a connection: %s\n", strdatabuffer1);
close(newclientsocketfd);
}
for(int i = 0 ; i < NUM_SOCKFD; i++)
{
if(FD_ISSET(arraysockfd[i] , &fdset_readfd))
{
int nrecvCnt = read(newclientsocketfd, strdatabuffer1, MAX_DATABUFFER_SIZE, 0);
if(nrecvCnt <= 0)
{
printf("client[%d] close\n",i);
close(arraysockfd[i]);
FD_CLR(arraysockfd[i], &fdset_readfd);
arraysockfd[i] = 0;
}
else
{
memset(&strdatabuffer1[nrecvCnt], '/0', 1);
printf("client[%d] send:%s\n", i, strdatabuffer1);
}
}
}
}
}
static unsigned long init_socket_listen(const int listen_port, int listensocket)
{
int listensocketfd;
struct sockaddr_in serversockaddr;
listensocketfd = socket(AF_INET, SOCK_STREAM, 0);
if(listensocketfd < 0)
{
perror("socket(AF_INET, SOCK_STREAM, 0)");
return -1;
}
int optIndexVal = 1;
setsockopt(listensocketfd, SOL_SOCKET, SO_REUSEADDR, (char*)&optIndexVal, sizeof(optIndexVal));
memset(&serversockaddr, 0, sizeof(serversockaddr));
serversockaddr.sin_family = AF_INET;
serversockaddr.sin_port = htons(listen_port);
serversockaddr.sin_addr.s_addr=INADDR_ANY;
bzero(&(serversockaddr.sin_zero), 8);
if(bind(listensocketfd, (struct sockaddr *)&serversockaddr, sizeof(serversockaddr)) < 0)
{
perror("bind(listensocketfd, (struct sockaddr *)&serversockaddr, sizeof(serversockaddr))");
close(listensocketfd);
exit(1);
}
printf("listen socket bind to the server port sucess!");
if(listen(listensocketfd, LISTEN_BACKLOGNUM) < 0)
{
perror("listen(listensocketfd, LISTEN_BACKLOGNUM)");
close(listensocketfd);
exit(1);
}
listensocket = listensocketfd
return 0;
}