Exemplo n.º 1
0
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);
		}
	}
}
Exemplo n.º 2
0
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 */
 
}   
Exemplo n.º 3
0
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;
}