static void set_get(NDB_SOCKET_TYPE fd, int level, int optval, const char *optname, int val) { int actual = 0, defval = 0; SOCKET_SIZE_TYPE len = sizeof(actual); my_getsockopt(fd, level, optval, (char*)&defval, &len); if (my_setsockopt(fd, level, optval, (char*)&val, sizeof(val)) < 0) { #ifdef DEBUG_TRANSPORTER g_eventLogger->error("setsockopt(%s, %d) errno: %d %s", optname, val, errno, strerror(errno)); #endif } len = sizeof(actual); if ((my_getsockopt(fd, level, optval, (char*)&actual, &len) == 0) && actual != val) { #ifdef DEBUG_TRANSPORTER g_eventLogger->error("setsockopt(%s, %d) - actual %d default: %d", optname, val, actual, defval); #endif } }
void dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen) { int n = 0; const int on = 1; char sendline[MAXLINE] = {0}; char recvline[MAXLINE + 1] = {0}; sigset_t sigset_alrm; socklen_t len ; struct sockaddr *preply_addr; preply_addr = my_malloc(servlen); //???为什么要这个? my_setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)); my_signal(SIGALRM, recvfrom_alarm); my_sigemptyset(&sigset_alrm); my_sigaddset(&sigset_alrm, SIGALRM); while (my_fgets(sendline, MAXLINE, fp) != NULL) { my_sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen); alarm(5); while(1) { len = servlen; // DEBUG; // printf("recvfrom 前面!\n"); my_sigprocmask(SIG_UNBLOCK, &sigset_alrm, NULL); n = recvfrom(sockfd, recvline, MAXLINE, 0, preply_addr, &len); my_sigprocmask(SIG_BLOCK, &sigset_alrm, NULL); if (n < 0) { if (errno == EINTR) { break; } else { err_sys("recvfrom error"); } } else { recvline[n] = 0; sleep(1); printf("from %s: %s", my_sock_ntop_host(preply_addr, len), recvline); } }//while }//while free(preply_addr); }
//p258 //执行服务器的通常步骤 int tcp_listen(const char *host, const char *serv, socklen_t *addrlenp) { int listenfd = 0; int n = 0; const int on = 1; struct addrinfo hints; struct addrinfo *res = NULL; struct addrinfo *ressave = NULL; bzero(&hints, sizeof(struct addrinfo)); hints.ai_flags = AI_PASSIVE; hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; printf("listen中!!!"); //if n != 0, 表示error if ( (n = getaddrinfo(host, serv, &hints, &res)) != 0 ) { err_quit("tcp_listen error for %s, %s: %s", host, serv, gai_strerror(n)); } ressave = res; //保存res do { //系统调用 listenfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); if (listenfd < 0) { continue; //error, try next one } my_setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); //系统调用 if (bind(listenfd, res->ai_addr, res->ai_addrlen) == 0) { break; //success! } my_close(listenfd); } while( (res = res->ai_next) != NULL ); if (res == NULL) { err_sys("tcp_listen error for %s, %s", host, serv); } my_listen(listenfd, LISTENQ); if (addrlenp) //addrlenp是一个指针 { //return size of protocal address(值结果参数) *addrlenp = res->ai_addrlen; } //printf("") struct sockaddr test ; printf("ai_addr = %s\n", my_inet_ntop(AF_INET, (const char *)ressave->ai_addr, (char*)&test, sizeof(test))); freeaddrinfo(ressave); return (listenfd); }
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); }