#include "main.h" //====================================================================== void * dialogThread(void *arg) { char buffer[0x100]; int ok; pthread_detach(pthread_self()); //---- obtain dialog socket from arg ---- int dialogSocket=*(int*)arg; free(arg); for(;;) { //---- receive and display message from client ---- int nb=recv(dialogSocket,buffer,0x100,0); if(nb<=0) { break; } 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); return (void *)0; } //====================================================================== // MAIN //====================================================================== int main(int argc, char **argv) { int ok; int portNumber; struct sockaddr_in myAddr; struct sockaddr_in fromAddr; //---- check command line arguments ---- if(argc!=2) { fprintf(stderr,"usage: %s port\n",argv[0]); exit(1); } //---- extract local port number ---- ok = sscanf(argv[1],"%d",&portNumber); if( ok == -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); if(bind(listenSocket,(struct sockaddr *)&myAddr,sizeof(myAddr))==-1) { perror("bind"); exit(1); } // ... listening connections if(listen(listenSocket,10)==-1) { perror("listen"); exit(1); } for(;;) { //---- 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)); //---- start a new dialog thread ---- pthread_t th; int *arg=(int *)malloc(sizeof(int)); *arg=dialogSocket; if(pthread_create(&th,(pthread_attr_t *)0,dialogThread,arg)) { fprintf(stderr,"cannot create thread\n"); exit(1); } } close(listenSocket); return 0; } //----------------------------------------------------------------------------