#include "main.h" //====================================================================== // MAIN //====================================================================== int main(int argc, char **argv) { int portNumber; struct sockaddr_in myAddr; int ok; int clients[0x100]; int nbClients=0; int i; struct sockaddr_in fromAddr; char buffer[0x100]; //---- check command line arguments ---- if(argc!=2) { fprintf(stderr,"usage: %s port\n",argv[0]); exit(1); } //---- extract local port number ---- if(sscanf(argv[1],"%d",&portNumber)!=1) { fprintf(stderr,"invalid port %s\n",argv[1]); exit(1); } //---- create listen socket ---- int listenSocket=socket(PF_INET,SOCK_STREAM,0); if(listenSocket==-1) { perror("socket"); exit(1); } // ... avoiding timewait problems (optional) int on=1; ok = setsockopt(listenSocket,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(int)); if( ok == -1 ){ perror("setsockopt"); exit(1); } // ... bound to any local address on the specified port myAddr.sin_family=AF_INET; myAddr.sin_port=htons(portNumber); myAddr.sin_addr.s_addr=htonl(INADDR_ANY); ok = bind(listenSocket,(struct sockaddr *)&myAddr,sizeof(myAddr)); if( ok == -1 ){ perror("bind"); exit(1); } // ... listening connections ok = listen(listenSocket,10); if( ok == -1 ){ perror("listen"); exit(1); } for(;;) { //---- wait for new connections or incoming messages ---- fd_set rdSet; FD_ZERO(&rdSet); FD_SET(listenSocket,&rdSet); int maxFd=listenSocket; for(i=0;imaxFd) maxFd=clients[i]; } ok = select(maxFd+1,&rdSet,(fd_set *)0,(fd_set *)0,(struct timeval *)0); if( ok == -1 ){ perror("select"); exit(1); } //---- accept and store new connection (if available) ---- if(FD_ISSET(listenSocket,&rdSet)) { socklen_t len=sizeof(fromAddr); int dialogSocket=accept(listenSocket,(struct sockaddr *)&fromAddr,&len); if(dialogSocket==-1) { perror("accept"); exit(1); } printf("new connection from %s:%d\n",inet_ntoa(fromAddr.sin_addr),ntohs(fromAddr.sin_port)); clients[nbClients++]=dialogSocket; } //---- dialog with each client providing a message ---- for(i=nbClients;i--;) { int dialogSocket=clients[i]; if(FD_ISSET(dialogSocket,&rdSet)) { //---- receive and display message from client (if available) ---- int nb=recv(dialogSocket,buffer,0x100,0); if(nb<=0) { printf("client disconnected\n"); close(dialogSocket); clients[i]=clients[--nbClients]; } else { buffer[nb]='\0'; printf("%s\n",buffer); //---- send reply to client ---- nb=sprintf(buffer,"%d bytes received\n",nb); ok = send(dialogSocket,buffer,nb,0); if( ok == -1 ){ perror("send"); exit(1); } } } } } close(listenSocket); return 0; } //----------------------------------------------------------------------------