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() */
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; }
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 () */