11.07.2015 Views

Les Réseaux Informatiques - Kro gpg

Les Réseaux Informatiques - Kro gpg

Les Réseaux Informatiques - Kro gpg

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

80err_quit("invalid host name for server: %s", host);serv_addr.sin_addr.s_addr = inaddr;}/* See if "port" is a service name or number */if ( (i = atoi(port)) == 0) {if ( (sp = getservbyname(port, protocol)) == NULL)err_ret("getservbyname() error for: %s/%s", port, protocol);} elseserv_addr.sin_port = sp->s_port;serv_addr.sin_port = htons(i);if ( (fd = socket(AF_INET, udp ? SOCK_DGRAM : SOCK_STREAM, 0)) < 0)err_sys("socket() error");if (reuseaddr) {on = 1;if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,of SO_REUSEADDR error");}(char err_sys("setsockopt/* Bind our well-known port so the client can connect to us. */if (bind(fd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)err_sys("can't bind local address");if (udp) {buffers(fd);if (foreignip[0] != 0) { /* connect to foreignip/port# */bzero((char *) &cli_addr, sizeof(cli_addr));cli_addr.sin_family = AF_INET;cli_addr.sin_addr.s_addr = inet_addr(foreignip);cli_addr.sin_port = htons(foreignport);/* connect() for datagram socket doesn't appear to alwildcarding of either IP address or port number */}}buffers(fd);if (connect(fd, (struct sockaddr *) &cli_addr, sizeof(cli_addr))sockopts(fd, 1);err_sys("connect() error");return(fd); /* nothing else to do *//* may set receive buffer size; must do here to getcorrect window advertised on SYN */sockopts(fd, 0); /* only set some socket options for fd */listen(fd, listenq);if (pauselisten)sleep(pauselisten); /* lets connection queue build up */if (dofork)TELL_WAIT(); /* initialize synchronization primitives */for ( ; ; ) {i = sizeof(cli_addr);if ( (newfd = accept(fd, (struct sockaddr *) &cli_addr, &i)) < 0)err_sys("accept() error");if (dofork) {if ( (pid = fork()) < 0)err_sys("fork error");if (pid > 0) {close(newfd); /* parent closes connected socket */WAIT_CHILD(); /* wait for child to output to terminal */continue; /* and back to for(;;) for another accept() */} else {close(fd); /* child closes listening socket */}}/* child (or iterative server) continues here */if (verbose) {/* Call getsockname() to find local address bound to socket:local INTERNET address is now determined (if multihomed). */i = sizeof(serv_addr);if (getsockname(newfd, (struct sockaddr *) &serv_addr, &i) < 0)err_sys("getsockname() error");}}buffers(newfd);/* Can't do one fprintf() since inet_ntoa() storesthe result in a static location. */fprintf(stderr, "connection on %s.%d ",INET_NTOA(serv_addr.sin_addr), ntohs(serv_addr.sin_port));fprintf(stderr, "from %s.%d\n",INET_NTOA(cli_addr.sin_addr), ntohs(cli_addr.sin_port));/* setsockopt() again, in case it didn't propagatefrom listening socket to connected socket */sockopts(newfd, 1); /* can set all socket options for this socket */if (dofork)TELL_PARENT(getppid()); /* tell parent we're done with terminal */return(newfd);80

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!