void tu8_9dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen) { int n = 0; char sendline[MAXLINE]; char recvline[MAXLINE]; socklen_t len ; struct sockaddr *preply_addr; //用于返回的地址, sockaddr!!! preply_addr = my_malloc(servlen); while (my_fgets(sendline, MAXLINE, fp) != NULL) { my_sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen); // printf("sendto %s : %s\n", // my_sock_ntop(preply_addr, len), sendline); len = servlen ; n = my_recvfrom(sockfd, recvline, MAXLINE, 0, preply_addr, &len); // printf("recvfrom %s : %s\n", // my_sock_ntop(preply_addr, len), recvline); if (len != servlen || memcmp(pservaddr, preply_addr, len) != 0) { printf("reply from %s (ignored)\n", my_sock_ntop(preply_addr, len)); continue; } recvline[n] = 0; my_fputs(recvline, stdout); } }
int main(int argc, char **argv) { int sockfd = 0; int n = 0; char recvline[MAXLINE + 1]; struct sockaddr_in servaddr; struct in_addr **pptr = NULL; // struct in_addr *inetaddrp[2]; // struct in_addr inetaddr; // struct hostent *hp = NULL; struct servent *sp = NULL; if ( argc != 3 ) { err_quit("usage: daytimetcpcli <hostname> <service>"); } if ( (hp = gethostbyname(argv[1])) == NULL ) { if (inet_aton(argv[1], &inetaddr) == 0) { err_quit("hostname error for %s: %s\n", argv[1], hstrerror(h_errno)); } else { inetaddrp[0] = &inetaddr; inetaddrp[1] = NULL; pptr = inetaddrp; //注意是有p的. } } else { pptr = (struct in_addr **) hp->h_addr_list; } //获得了相应服务的端口号什么的 if ( (sp = getservbyname(argv[2], "tcp")) == NULL ) { err_quit("getservbyname error for %s\n", argv[2]); } for ( ; *pptr != NULL; pptr++ ) { sockfd = my_socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = sp->s_port; //帅 memcpy(&servaddr.sin_addr, *pptr, sizeof(struct in_addr)); printf("trying %s\n", my_sock_ntop((SA *) &servaddr, sizeof(servaddr))); if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) == 0) { break; //success } err_ret("connect error"); close(sockfd); } if (*pptr == NULL) //这里不是很懂 { err_quit("unable to connect"); } while ((n= my_read(sockfd, recvline, MAXLINE)) > 0) { recvline[n] = 0; my_fputs(recvline, stdout); } exit (0); }
int main(int argc, char **argv) { //int sockfd; int flag_local =0; int flag_same =0; struct ifi_info *ifi; struct ifi_info *ifiClient; struct sockaddr_in *sin, *mask, *locAddr, *tempAddr; struct sockaddr_in servaddr, cliaddr; char serverStr[INET_ADDRSTRLEN], clientStr[INET_ADDRSTRLEN]; struct sockaddr *sa; bzero(&servaddr, sizeof(servaddr)); bzero(&cliaddr, sizeof(cliaddr)); memset(serverStr, 0, INET_ADDRSTRLEN); memset(clientStr, 0, INET_ADDRSTRLEN); client_args c_arguments; memset(&c_arguments, 0, sizeof(c_arguments)); if(RET_FAILURE == read_client_input_file(&c_arguments)) { exit(RET_FAILURE); } #ifdef DEBUG printf("IP address: %s\n", c_arguments.ipAddress); printf("Port number: %d\n", c_arguments.port_number); printf("File to send: %s\n", c_arguments.file_name); printf("Window size: %d\n", c_arguments.window_size); printf("Seed: %d\n", c_arguments.seed); printf("Probability: %f\n", c_arguments.probability); printf("Mean time: %d\n", c_arguments.mean_time); #endif unsigned long serverAddress=0; unsigned long temp=0, tempMask=0; unsigned long longestNetMask=0, longestNetMaskDiff =0; //Diff for server if on different network char* serverIPAddress = c_arguments.ipAddress; char* loopBack = "127.0.0.1"; unsigned long loopBackAddress =0; inet_pton(AF_INET, loopBack, &loopBackAddress); inet_pton(AF_INET, serverIPAddress, &servaddr.sin_addr); /* ** Step 1 ** To check whether the server is local or not */ for(ifi = get_ifi_info_plus(AF_INET, 1); ifi != NULL; ifi=ifi->ifi_next) { mask = ((struct sockaddr_in *)ifi->ifi_ntmaddr); locAddr = ((struct sockaddr_in *)ifi->ifi_addr); if((servaddr.sin_addr.s_addr & mask->sin_addr.s_addr) == (locAddr->sin_addr.s_addr & mask->sin_addr.s_addr)) { //To check Whether the server is on same network, if yes choose the highest precision netmask address flag_local = 1; temp = mask->sin_addr.s_addr; printf("MAsk of the interface : %ld\n", temp); if(temp > longestNetMask) { longestNetMask = temp; ifiClient = ifi; } //printf("Server is on the host itself \n"); if(servaddr.sin_addr.s_addr == locAddr->sin_addr.s_addr) { flag_same = 1; } } else { tempMask = mask->sin_addr.s_addr; if(tempMask > longestNetMaskDiff) { longestNetMaskDiff = temp; ifiClient = ifi; } } printf("Information for an interface\n"); printf("Name : %s\n", ifi->ifi_name); printf("Address : %s\n", my_sock_ntop(ifi->ifi_addr, sizeof(struct sockaddr))); printf("NetWork Mask : %s\n",my_sock_ntop(ifi->ifi_ntmaddr, sizeof(struct sockaddr))); printf("\n"); } if(flag_same == 1) { servaddr.sin_addr.s_addr = loopBackAddress; locAddr->sin_addr.s_addr = loopBackAddress; cliaddr.sin_addr.s_addr = loopBackAddress; } else if(flag_local == 1) { locAddr = ((struct sockaddr_in *)ifiClient->ifi_addr); cliaddr.sin_addr = locAddr->sin_addr; } else { locAddr = ((struct sockaddr_in *)ifiClient->ifi_addr); cliaddr.sin_addr = locAddr->sin_addr; } //printf("IS server on same network = %d\n Is server Local =%d \n", flag_same, flag_local); if(inet_ntop(AF_INET,&servaddr.sin_addr, serverStr, sizeof(serverStr)) <= 0) { perror("INET_PTON error:"); } /*if(inet_ntop(AF_INET,&locAddr->sin_addr, clientStr, sizeof(clientStr)) <= 0) { perror("INET_PTON error:"); }*/ if(inet_ntop(AF_INET,&cliaddr.sin_addr, clientStr, sizeof(clientStr)) <= 0) { perror("INET_PTON error:"); } //printf("Server address: %s\n",serverStr); //printf("Client Address: %s\n", clientStr); /* ** Step 2 ** Bind the UDP Socket to that client and server Address */ int sockfd; sockfd = socket(AF_INET, SOCK_DGRAM, 0); if(sockfd < 0) { perror("Error while creating UDP Socket:"); exit(1); } if(flag_same == 1) { int optval =1; setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR | SO_DONTROUTE, &optval, sizeof optval); } cliaddr.sin_family = AF_INET; cliaddr.sin_port = htons(0); if(bind(sockfd, (struct sockaddr *) &cliaddr, sizeof(cliaddr)) < 0) { perror("Bind error:"); exit(1); } struct sockaddr_in cliSock; socklen_t len; bzero(&cliSock, sizeof(cliSock)); len = sizeof(cliSock); if(getsockname(sockfd, (struct sockaddr *) &cliSock, &len) < 0) { perror("Get Socket Name error:"); exit(1); } printf("Client Binded to %s:%u\n",inet_ntoa(cliSock.sin_addr), ntohs(cliSock.sin_port)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(c_arguments.port_number); //printf("Sever port : %d %d\n", servaddr.sin_port,MY_SERV_PORT); if(connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr))< 0) { perror("Server Connection Failed:"); exit(1); } struct sockaddr_in servSock; //socklen_t len; bzero(&servSock, sizeof(servSock)); len = sizeof(servSock); if(getpeername(sockfd, (struct sockaddr*)&servSock, &len) < 0) { perror("Getpeername failed :"); exit(1); } printf("Server address %s:%u\n",inet_ntoa(servSock.sin_addr), ntohs(servSock.sin_port)); /* ** Step 3 ** Start acknowledgement with the server */ fileClient(sockfd, &servaddr, sizeof(servaddr), &c_arguments); }
void dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen) { int n = 0; int maxfdp1 = 0; const int on = 1; char sendline[MAXLINE] = {0}; char recvline[MAXLINE] = {0}; fd_set rset; socklen_t len; struct sockaddr *preply_addr = NULL; preply_addr = my_malloc(servlen); my_setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)); my_pipe(pipefd); // printf("pipefd[0] = %d\n", pipefd[0]); //+ maxfdp1 = max(sockfd, pipefd[0]) + 1; FD_ZERO(&rset); my_signal(SIGALRM, recvfrom_alarm); while (my_fgets(sendline, MAXLINE, fp) != NULL ) { my_sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen); alarm(3); while (1) { FD_SET(sockfd, &rset); FD_SET(pipefd[0], &rset); if ( (n = select(maxfdp1, &rset, NULL, NULL, NULL)) < 0 ) { if (errno == EINTR) { DEBUG; printf("select errno = EINTR\n"); //+ continue; } else { err_sys("select error"); } } // printf("kankan!\n"); if ( FD_ISSET(sockfd, &rset) ) { len = servlen; n = my_recvfrom(sockfd, recvline, MAXLINE, 0, preply_addr, &len); recvline[n] = 0; printf("from %s: %s", my_sock_ntop(preply_addr, len), recvline); } if ( FD_ISSET(pipefd[0], &rset) ) { // printf("read 上面\n"); my_read(pipefd[0], &n, 1); //timer expired // printf("read 下面!\n"); break; } } } free(preply_addr); }