int main(int argc, const char *argv[])
{
	int listenfd, connfd;
	pid_t childpid;
	socklen_t clilen;
	struct sockaddr_in cliaddr, servaddr;
	listenfd = socket_r(AF_INET, SOCK_STREAM, 0);
	bzero(&servaddr, sizeof(servaddr));
	servaddr.sin_family = AF_INET;
	servaddr.sin_addr.s_addr = htonl(argv[1]);
	servaddr.sin_port = htons(80);
	//void bind_r(int listening_socket, const struct sockaddr *addr, socklen_t addrlen, void *arg);
	bind_r(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr), (char *)argv[1]);
	//void listen_r(int sockfd, int backlog, void *arg);
	listen_r(listenfd, 10, (char *)argv[1]);
	for(;;){
		clilen = sizeof(cliaddr);
		//int accept_r(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
		connfd = accept_r(listenfd, (struct sockaddr *)&cliaddr, &clilen);	
		if((childpid = fork_r()) == 0){
			close_r(listenfd);
			str_echo(connfd);
			exit(0);
		}
	}
	close_r(connfd);
	return 0;
}
void start_test(int role) {
	int sk, pid;
	int i = 0;

	DEBUG_PRINT(DEBUG_NONE, "\nStarting tests...\n");

	repeat_count = repeat;

	DEBUG_PRINT(DEBUG_MIN, "\tsocket(SOCK_STREAM, IPPROTO_SCTP)");

	if ((sk = socket(s_loc.ss_family, SOCK_STREAM, IPPROTO_SCTP)) < 0 ) {
		fprintf(stderr, "\n\n\t\t*** socket: failed to create"
			" socket:  %s ***\n", strerror(errno));
		exit(1);
	}
	DEBUG_PRINT(DEBUG_MIN, "  ->  sk=%d\n", sk);

	bind_r(sk, &s_loc);

	if (role == SERVER) {
		listen_r(sk, 1);
		accept_r(sk);
	} else {
		connect_r(sk, (struct sockaddr *)&s_rem, r_len);
	}

	if ((pid = fork()) == 0) {
		settimerhandle();
		printstatus(gsk);
		while(1);
	} else {
		if (!debug_level) {
			printf("     ");
		}

		for(i = 0; i < repeat_count; i++) {

			if (role == SERVER) {
				DEBUG_PRINT(DEBUG_NONE, "Server: Receiving packets.(%d/%d)\n",
					i+1, repeat_count);
				server(gsk);
			} else {
				DEBUG_PRINT(DEBUG_NONE, "Client: Sending packets.(%d/%d)\n",
					i+1, repeat_count);
				client(sk);
			}

			fflush(stdout);
		}

		if (role == SERVER) close_r(gsk);
		close_r(sk);
	}
} /* start_test() */
Exemple #3
0
int main(int argc, const char *argv[])
{
	
	struct sockaddr_in server_addr, client_addr;
	socklen_t client_addr_len;
	int connection_sock, listen_sock;
	char buf[MAXLINE];
	char str[INET_ADDRSTRLEN];
	int i,n;
	char bindmsg[1024];

	int optval = 1;

	//struct sigaction {
	//void     (*sa_handler)(int);
	//void     (*sa_sigaction)(int, siginfo_t *, void *);
	//sigset_t   sa_mask;
	//int        sa_flags;
	//void     (*sa_restorer)(void);
	//};
	struct sigaction act, oact;

	//void *memcpy(void *dest, const void *src, size_t n);
	strcpy(bindmsg, argv[1]);
	strcat(bindmsg, " prot 8000");
	if(argc != 2)
		err_sys("Usage ./server server_addr");
	//int socket_r(int domain, int type, int protocol);
	listen_sock = socket(AF_INET, SOCK_STREAM, 0);

	//int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);
	setsockopt_r(listen_sock, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval));

	memset(&server_addr, 0, sizeof(server_addr));
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(SERVER_PORT);
	//int inet_pton(int af, const char *src, void *dst);
	inet_pton(AF_INET, argv[1], &server_addr.sin_addr);

	//void bind_r(int listening_socket, const struct sockaddr *addr, socklen_t addrlen, void *arg);
	bind_r(listen_sock, (struct sockaddr *)&server_addr, sizeof(server_addr), (void *)bindmsg);
	//void listen_r(int sockfd, int backlog, void *arg);
	listen_r(listen_sock, SERVER_BACKLOG, (void *)bindmsg);

	//int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact)

//siganl process
	act.sa_flags = 0;
	act.sa_handler = signal_handler;
	sigemptyset(&act.sa_mask);

	sigaction(SIGCHLD, &act, &oact);

	fprintf(stdout, "accepting connections ...\n");
	
	pid_t pid;
	while(1){
		client_addr_len = sizeof(client_addr);
		//int accept_r(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
		connection_sock = accept_r(listen_sock, (struct sockaddr *)&client_addr, &client_addr_len);
		if(connection_sock < 0){
			if(errno == EINTR)
				continue;
			err_ret("accept() failed");
		}

		pid = fork();
		if(pid < 0)
			err_sys("call to fork");
		else if(pid == 0){
			close_r(listen_sock);
		//ssize_t read_r(int fd, void *ptr, size_t nbytes);
			while(1){
				n = read_r(connection_sock, buf, MAXLINE);
				if(n == 0) {
					fprintf(stdout, "peer side(%s port %d) has been closed.\n", inet_ntop(AF_INET, &client_addr.sin_addr, str, sizeof(str)), ntohs(client_addr.sin_port));
					break;
				}

				fprintf(stdout, "reciveed from %s at port %d\n", inet_ntop(AF_INET, &client_addr.sin_addr, str, sizeof(str)), ntohs(client_addr.sin_port));
				for (i = 0; i < n; i++) 
				{
					buf[i] = toupper(buf[i]);
				}
				//ssize_t write_r(int fd, const void *ptr, size_t nbytes);
				write_r(connection_sock, buf, n);
			}
			close_r(connection_sock);	
			exit(0);
		} else {
			close_r(connection_sock);	
		}
			//void close_r(int fd);
			//close_r(connection_sock);
	}
	return 0;
}
Exemple #4
0
int receive_r(int sk, int once)
{
	int recvsk = sk, i = 0, error = 0;
        char incmsg[CMSG_SPACE(sizeof(_sctp_cmsg_data_t))];
        struct iovec iov;
        struct msghdr inmessage;

        /* Initialize inmessage with enough space for DATA... */
        memset(&inmessage, 0, sizeof(inmessage));
        if ((iov.iov_base = malloc(REALLY_BIG)) == NULL) {
		fprintf(stderr, "\n\t\t*** malloc not enough memory!!! ***\n");
		exit(1);
	}
	iov.iov_len = REALLY_BIG;
	inmessage.msg_iov = &iov;
	inmessage.msg_iovlen = 1;
	/* or a control message.  */
	inmessage.msg_control = incmsg;
	inmessage.msg_controllen = sizeof(incmsg);

	/* Get the messages sent */
	while (1) {

		if (recvsk == sk && socket_type == SOCK_STREAM &&
		    role == SERVER)
			recvsk = accept_r(sk);

		DEBUG_PRINT(DEBUG_MIN, "\trecvmsg(sk=%d) ", sk);

		error = recvmsg(recvsk, &inmessage, MSG_WAITALL);
		if (error < 0 && error != EAGAIN) {
			if (errno == ENOTCONN && socket_type == SOCK_STREAM &&
			    role == SERVER) {
				printf("No association is present now!!\n");
				close(recvsk);
				recvsk = sk;
				continue;
			}

			fprintf(stderr, "\n\t\t*** recvmsg: %s ***\n\n",
					strerror(errno));
			fflush(stdout);
			if (do_exit) exit(1);
			else goto error_out;
		}
		else if (error == 0) {
			if (socket_type == SOCK_STREAM && role == SERVER) {
				printf("No association is present now!!\n");
				close(recvsk);
				recvsk = sk;
				continue;
			}
			printf("\n\t\trecvmsg() returned 0 !!!!\n");
			fflush(stdout);
		}

		if (print_message(recvsk, &inmessage, error) > 0)
			continue; /* got a notification... */

		inmessage.msg_control = incmsg;
		inmessage.msg_controllen = sizeof(incmsg);
		iov.iov_len = REALLY_BIG;
		i++;
		if (once)
			break;
	}

	if (recvsk != sk)
		close(recvsk);

	free(iov.iov_base);
	return 0;
error_out:
	close(sk);
	free(iov.iov_base);
	return -1;

} /* receive_r () */