#include "main.h" //====================================================================== // MAIN //====================================================================== int main(int argc, char **argv) { int portNumber; struct sockaddr_in myAddr; struct sockaddr_in fromAddr; int ok; 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(;;) // 1st LOOP : ACCEPT CLIENTS { //---- accept new connection ---- 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)); for(;;) // 2nd LOOP : RECEIVE MESSAGES { //---- receive and display message from client ---- int nb=recv(dialogSocket,buffer,0x100,0); if(nb<=0) { break; } // EOF 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 dialog socket ---- printf("client disconnected\n"); close(dialogSocket); } close(listenSocket); return 0; } //----------------------------------------------------------------------------