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); }
void tu8_19dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen) { int i = 0; char sendline[DGLEN]; for (i = 0; i < NDG; i++) { my_sendto(sockfd, sendline, DGLEN, 0, pservaddr, servlen); } printf("i = %d\n", i); }
void dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen) { int n = 0; char sendline[MAXLINE]; char recvline[MAXLINE + 1]; //!!! while (my_fgets(sendline, MAXLINE, fp) != NULL) { my_sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen); n = my_recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL); recvline[n] = 0; my_fputs(recvline, stdout); } }
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 error, sock_listen, sock_recv, sock_send; struct sockaddr_ipx sipx_listen, sipx_send; pid_t childpid, parentpid; /* * Socket to receive with. */ sock_listen = socket(PF_IPX, SOCK_STREAM, 0); if (sock_listen < 0) err(-1, "sock_listen = socket(PF_IPX, SOCK_STREAM, 0)"); bzero(&sipx_listen, sizeof(sipx_listen)); sipx_listen.sipx_len = sizeof(sipx_listen); sipx_listen.sipx_family = AF_IPX; sipx_listen.sipx_addr = ipx_addr(IPX_ENDPOINT); if (bind(sock_listen, (struct sockaddr *)&sipx_listen, sizeof(sipx_listen)) < 0) err(-1, "bind(sock_listen)"); if (listen(sock_listen, -1) < 0) err(-1, "listen(sock_listen)"); parentpid = getpid(); childpid = fork(); if (childpid < 0) err(-1, "fork()"); if (childpid == 0) { /* * The child: accept connections and process data on them. */ while (1) { sock_recv = accept(sock_listen, NULL, NULL); if (sock_recv < 0) { warn("accept()"); continue; } my_recv(sock_recv, "listener", parentpid); my_send(sock_recv, "listener", parentpid); close(sock_recv); } } else { /* * The parent: connect, send data, receive it back, and exit; * build two connections, once using a full connect() API * call, and the second using sendto(). */ /* * Socket to send with. */ sock_send = socket(PF_IPX, SOCK_STREAM, 0); if (sock_send < 0) { error = errno; (void)kill(childpid, SIGTERM); errno = error; err(-1, "sock_send = socket(PF_IPX, SOCK_STREAM, 0)"); } bzero(&sipx_send, sizeof(sipx_send)); sipx_send.sipx_len = sizeof(sipx_send); sipx_send.sipx_family = AF_IPX; sipx_send.sipx_addr = ipx_addr(IPX_ENDPOINT); if (connect(sock_send, (struct sockaddr *)&sipx_send, sizeof(sipx_send)) < 0) { error = errno; (void)kill(childpid, SIGTERM); errno = error; err(-1, "sock_send = socket(PF_IPX, SOCK_STREAM, 0)"); } my_send(sock_send, "connector", childpid); my_recv(sock_send, "connector", childpid); close(sock_send); #ifdef SPX_SUPPORTS_SENDTO_WITH_CONNECT sock_send = socket(PF_IPX, SOCK_STREAM, 0); if (sock_send < 0) { error = errno; (void)kill(childpid, SIGTERM); errno = error; err(-1, "sock_send = socket(PF_IPX, SOCK_STREAM, 0)"); } bzero(&sipx_send, sizeof(sipx_send)); sipx_send.sipx_len = sizeof(sipx_send); sipx_send.sipx_family = AF_IPX; sipx_send.sipx_addr = ipx_addr(IPX_ENDPOINT); my_sendto(sock_send, "connector", childpid, (struct sockaddr *)&sipx_send, sizeof(sipx_send)); my_recv(sock_send, "connector", childpid); close(sock_send); #endif (void)kill(childpid, SIGTERM); } return (0); }
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); }