Ejemplo n.º 1
0
int main(int argc, char const *argv[])
{
    int listenfd, connfd;
    pid_t childpid;
    socklen_t clilen;
    struct sockaddr_in cliaddr, servaddr;
    struct sigaction act, oact;
    act.sa_handler = sig_int;
    act.sa_flags = SA_RESETHAND;

    listenfd = socket(AF_INET, SOCK_STREAM, 0);
    if (listenfd == -1)
        handle_err("socket error");

    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(SERV_PORT);

    if (bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0 )
        handle_err("binding error");

    if (listen(listenfd, LISTEN_BACKLOG) == -1)
        handle_err("listen error");

    if (sigaction(SIGINT, &act, &oact) < 0) {
        handle_err("sigaction error");
    }

    /* call accept, wait for a client */ 
    for ( ; ; ) {
        clilen = sizeof(cliaddr);
        connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &clilen); 
        if (connfd == -1)
            handle_err("accept error");

        if (shutdown(connfd, SHUT_RDWR) < 0)
            handle_err("shutdown error");

        if ((childpid = fork()) < 0)
            handle_err("fork error");
        else if (childpid == 0) { /* child process */
            close(listenfd);
            str_write(connfd); /* process the request */
            exit(0);
        }

        close(connfd); /* parent closes connected socket */
    }

    exit(EXIT_SUCCESS);
}
Ejemplo n.º 2
0
void stop_do(int sockfd, int family)
{
	struct sockaddr client_addr;
	socklen_t len = (family == AF_INET) ? 16 : 28;
	for ( ; ;)
	{
		int clientfd = Accept(sockfd, &client_addr, &len);
		print_ip_addr(family, &client_addr, "remote client address:");
		bzero(&client_addr, sizeof(client_addr));
		pid_t child;
		if ((child = fork()) < 0)
			err_sys("fork error");
		else if (child == 0) {
			Close(sockfd);
			str_write(clientfd);
			exit(0);
		}
		Close(clientfd);
	}
}
Ejemplo n.º 3
0
void str_repeat(const char *s, int outlen) {
   printf("void str_repeat(const char *s, int outlen) {\n");
   int len = strlen(s) * (1 + WIDTH);
   outlen += outlen / WIDTH;

   const char *ss = s;
   char *buf = malloc(len);
   int pos = 0;

   while (pos < len) {
      printf(" while (pos < len) {\n");
      if (!*ss) {
          printf(" if (!*ss) {\n");
          ss = s;
      }
      buf[pos++] = *ss++;
      if (pos >= len) {
          printf(" if (pos >= len) {\n");
          break;
      }
      if (pos % (WIDTH + 1) == WIDTH) {
         printf(" if (pos %% (WIDTH + 1) == WIDTH) {\n");
         buf[pos++] = '\n';
      }
   }

   int fd = fileno(stdout);
   int l = 0;
   while (outlen > 0) {
      printf(" while (outlen > 0) {\n");
      l = outlen > len ? len : outlen;
      wrap_write(fd, buf, l);
      outlen -= len;
   }
   if (buf[l-1] != '\n') {
       printf(" if (buf[l-1] != '\n') {\n");
       str_write("\n");
   }

   free(buf);
}