/* serverwiththread.c - creates a connection oriented (stream) socket in the Internet domain for the Unix Operating system Each connection is handled in a separate thread To compile on solaris gcc ... -lnsl -lsocket -lpthread To compile on freebsd gcc ... -pthread */ #include #include #include #include #include #include #include #include #define BUFSIZE 1024 extern int errno; void error(char *msg) { perror(msg); exit(0); } int main(int argc, char *argv[]) { int sock, *newsock, len, fromlen, retval; unsigned short port; struct sockaddr_in server; struct sockaddr_in from; pthread_t tid; void *ConnectionThread(void *); //function prototype if (argc < 2) { fprintf(stderr,"usage %s portnumber\n",argv[0]); exit(0); } port = (unsigned short) atoi(argv[1]); sock=socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) error("Opening socket"); server.sin_family=AF_INET; server.sin_addr.s_addr=INADDR_ANY; server.sin_port=htons(port); len=sizeof(server); if (bind(sock, (struct sockaddr *)&server, len) < 0) error("binding socket"); fromlen=sizeof(from); if (listen(sock,5) < 0) error("listening");; while (1) { newsock = (int *)malloc(sizeof (int)); *newsock=accept(sock, (struct sockaddr *)&from, &fromlen); if (*newsock < 0) error("Accepting"); printf("A connection has been accepted from %s\n", inet_ntoa((struct in_addr)from.sin_addr)); retval = pthread_create(&tid, NULL, ConnectionThread, (void *)newsock); if (retval != 0) { error("Error, could not create thread"); } } return 0; // we never get here } /****** ConnectionThread **********/ void *ConnectionThread(void *arg) { int sock, n, len; char buffer[BUFSIZE]; char *msg = "Got your message"; sock = *(int *)arg; len = strlen(msg); n = read(sock,buffer,BUFSIZE-1); while (n > 0) { buffer[n]='\0'; printf("Message is %s\n",buffer); n = write(sock,msg,len); if (n < len) error("Error writing"); n = read(sock,buffer,BUFSIZE-1); if (n < 0) error("Error reading"); } if (close(sock) < 0) error("closing"); pthread_exit(NULL); return NULL; }