int main(int argc, char **argv) { atexit(on_client_exit); const char *cargs_file = CARGS_FILE; cargs = MALLOC(client_args); if (read_cargs((const char *)cargs_file, cargs)) { exit(1); } utils_init(); perhaps_init(); vector_init(&interfaces, sizeof(struct ifi_info)); // Initialize the receiving window rwindow_init(&rwin, cargs->sw_size); get_all_interfaces(); // Call print_ifi_info(). print_ifi_info((struct ifi_info*)vector_at(&interfaces, 0)); conn = MALLOC(client_conn); file_name_pkt = MALLOC(packet_t); memset(file_name_pkt, 0, sizeof(packet_t)); file_name_pkt->ack = 0; file_name_pkt->seq = 0; file_name_pkt->flags = FLAG_SYN; file_name_pkt->datalen = strlen(cargs->file_name); strcpy(file_name_pkt->data, cargs->file_name); get_conn(conn); INFO("Server is %s\nIPServer: %s\nIPClient: %s\n", (conn->is_local ? "Local" : "Not Local"), sa_data_str(conn->serv_sa), sa_data_str(conn->cli_sa)); initiate_tx(); return 0; }
int main(int argc, char** argv) { struct datagram conn_gram; struct ifi_info *ifihead, *ifi; struct sockaddr_in servaddr; struct sockaddr_in cliaddr; fd_set rset, allset; socklen_t len; ssize_t n; int nready; int on = 1; int maxfdp1 = 0; int i; int send_flag; pid_t pid; ifihead = get_ifi_head(); printf("Server IP Addresses:\n"); print_ifi_info(ifihead); readfile(); printf("Listening port %d\n", port); count = 0; for (ifi=ifihead;ifi!=NULL;ifi=ifi->ifi_next) { if (!(ifi->ifi_flags & IFF_UP)) continue; addrs[count] = ifi; sockfds[count] = Socket(AF_INET, SOCK_DGRAM, 0); if (sockfds[count] > maxfdp1) maxfdp1 = sockfds[count]; Setsockopt(sockfds[count], SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); memcpy(&servaddr, ifi->ifi_addr, sizeof(servaddr)); servaddr.sin_port = htons(port); Bind(sockfds[count], (SA *) &servaddr, sizeof(servaddr)); count++; if (count >= MAX_IFI_COUNT) break; } FD_ZERO(&allset); FD_ZERO(&rset); for (i=0;i<count;i++) { FD_SET(sockfds[i], &allset); } maxfdp1 = maxfdp1+1; signal(SIGCHLD, sigchld); for(;;) { rset = allset; if ((nready = select(maxfdp1, &rset, NULL, NULL, NULL)) < 0) { if (errno == EINTR) continue; else err_sys("select error"); } for (i=0;i<count;i++) { if (FD_ISSET(sockfds[i], &rset)) { len = sizeof(cliaddr); n = recv_from(sockfds[i], &conn_gram, &cliaddr, &len); send_flag = get_flag(&conn_gram); if (!n || (send_flag & RETRY)) { // client timeout, don't fork new child continue; } printf("Client [%s:%d] connected\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port)); pid = fork(); if (!pid) { child(i, &cliaddr, &conn_gram); // exit return 0; } } } } free_ifi_info_plus(ifihead); return 0; }