void do_fork(int msock) { int ssock, clilen; struct sockaddr_in client_addr; while(1) { printf("Waiting for client connection\n"); ssock = accept(msock ,(struct sockaddr *) &client_addr, &clilen); if (ssock < 0) { printf("server: accept error: %s\n", strerror(errno)); exit(1); } switch(fork()) { case 0: close(msock); doftp((void *)(long)ssock); exit(1); break; default: close(ssock); break; case -1: printf("Failed to fork\n"); exit(1); } } }
int main() { int sockid, newsd, pid, clilen; struct sockaddr_in my_addr, client_addr; printf("server: creating socket\n"); if ((sockid = socket(AF_INET,SOCK_STREAM,0)) < 0) { printf("server: socket error : %d\n", errno); exit(0); } printf("server: binding my local socket\n"); bzero((char *) &my_addr,sizeof(my_addr)); my_addr.sin_family = AF_INET; my_addr.sin_port = htons(MY_PORT_ID); my_addr.sin_addr.s_addr = htons(INADDR_ANY); if (bind(sockid ,(struct sockaddr *) &my_addr,sizeof(my_addr)) < 0) { printf("server: bind error :%d\n", errno); exit(0); } printf("server: starting listen \n"); if (listen(sockid,5) < 0) { printf("server: listen error :%d\n",errno);exit(0); } while(1==1) { /* ACCEPT A CONNECTION AND THEN CREATE A CHILD TO DO THE WORK */ /* LOOP BACK AND WAIT FOR ANOTHER CONNECTION */ printf("server: starting accept\n"); if ((newsd = accept(sockid ,(struct sockaddr *) &client_addr, &clilen)) < 0) { printf("server: accept error :%d\n", errno); exit(0); } printf("server: return from accept, socket for this ftp: %d\n", newsd); if ( (pid=fork()) == 0) { /* CHILD PROC STARTS HERE. IT WILL DO ACTUAL FILE TRANSFER */ close(sockid); /* child shouldn't do an accept */ doftp(newsd); close (newsd); exit(0); /* child all done with work */ } /* PARENT CONTINUES BELOW HERE */ close(newsd); /* parent all done with client, only child */ } /* will communicate with that client from now on */ }
int main(int argc, char *argv[]) { int sockfd, newsockfd, portno, n; pid_t pid; struct sockaddr_in serv_addr, clt_addr; socklen_t addrlen; char buffer[256]; if (argc != 2) { fprintf(stderr, "Usage: %s <port>\n", argv[0]); return 1; } portno = atoi(argv[1]); sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) syserr("can't open socket"); printf("create socket...\n"); memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(portno); if (bind(sockfd, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) < 0) syserr("can't bind"); printf("bind socket to port %d...\n", portno); listen(sockfd, 5); for (;;) { printf("wait on port %d...\n", portno); addrlen = sizeof(clt_addr); newsockfd = accept(sockfd, (struct sockaddr*) &clt_addr, &addrlen); if (newsockfd < 0) syserr("can't accept"); if (!(pid = fork())) { close(sockfd); doftp(newsockfd); close(newsockfd); exit(0); } } close(sockfd); return 0; }