#include <stdio.h> #include <netinet/in.h> #include <sys/socket.h> #include <unistd.h> #include <stdlib.h> #include <pthread.h> struct thread_parm { char * ptr; char *t; int newsockfd; }; void * thread_sock(void * parameters) { struct thread_parm * p = (struct thread_parm *) parameters; int n; n=0; n = readline(p->newsockfd,p->ptr,512); printf("%s\n",p->ptr); write(p->newsockfd,p->t,n); close(p->newsockfd); } int readline(int fd,char *ptr, int maxlen); int main() { char ptr[512]; char *t; char cpid[25]; //child process number char[] char c; int pid; int sockfd, newsockfd, clilen, childpid, rc, n,i; pthread_t thread_id; struct thread_parm thread_args; struct sockaddr_in cli_addr, serv_addr; t=ptr; n=0; if((sockfd = socket(AF_INET,SOCK_STREAM,0))<0) perror("socket error"); bzero((char *) &serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(5000); if(bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr))<0) perror("bind error"); listen(sockfd, 5); for(;;){ clilen = sizeof(cli_addr); newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); if(newsockfd<0) perror("accept error"); thread_args.ptr = ptr; thread_args.t = t; thread_args.newsockfd = newsockfd; pthread_create(&thread_id, NULL, &thread_sock, &thread_args); } return 0; } int readline(int fd,char *ptr, int maxlen){ int i; int rc; char c; for(i=1;i<maxlen;i++){ if((rc=read(fd, &c, 1))==1) { *ptr++ = c; if(c=='\n') break; }else if (rc==0) { if(i==1) return 0; else break; }else return -1; } *ptr = 0; return i; };