|
|
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
void gravedigger(void);
void copystr(int, char *);
int main(int argc, char **argv)
{
int lsd, csd, clen;
struct sockaddr_in *lsock, *csock;
char cread[1024];
int sockopt = 1;
int portnum;
pid_t forkpid;
if (argc != 2) {
fprintf(stderr, "argv[1] == port number.");
exit(1);
}
portnum = atoi(argv[1]);
signal(SIGCHLD, gravedigger);
lsock = (struct sockaddr_in *) malloc(sizeof(struct sockaddr_in));
csock = (struct sockaddr_in *) malloc(sizeof(struct sockaddr_in));
if ((lsd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket");
exit(1);
}
if (setsockopt(lsd, SOL_SOCKET, SO_REUSEADDR, (char *)&sockopt, sizeof(sockopt)) < 0) {
perror("setsockopt");
exit(1);
}
bzero(lsock, sizeof(struct sockaddr_in));
bzero(csock, sizeof(struct sockaddr_in));
lsock->sin_family = AF_INET;
lsock->sin_port = htons(portnum);
lsock->sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(lsd, lsock, sizeof(struct sockaddr_in)) < 0) {
perror("bind");
exit(1);
}
if (listen(lsd, 2) < 0) {
perror("listen");
exit(1);
}
while ((csd = accept(lsd, csock, &clen)) > 0) {
forkpid = fork();
if (forkpid < 0) {
perror("accept");
abort();
} else if (forkpid > 0) {
continue;
} else {
memset(cread, '\0', sizeof(cread));
while (read(csd, cread, sizeof(cread)) > 0) {
copystr(csd, cread);
memset(cread, '\0', sizeof(cread));
}
shutdown(csd, 2);
exit(0);
}
}
shutdown(csd, 2);
return 0;
}
void copystr(int csd, char *readin)
{
char overflow[80];
memset(overflow, '\0', sizeof(overflow));
printf("readin: %s", readin);
strcpy(overflow, readin);
write(csd, overflow, strlen(overflow));
printf("overflow: %s", overflow);
}
void gravedigger(void)
{
fprintf(stderr, "SIGCHLD caught.\n");
wait();
}
|