📄 peel_client.c
字号:
str = "ADDRESS ADDED"; break; case SCTP_ADDR_MADE_PRIM: str = "ADDRESS MADE PRIMARY"; break; default: str = "UNKNOWN"; } /* end switch */ sin6 = (struct sockaddr_in6 *)&spc->spc_aaddr; if (sin6->sin6_family == AF_INET6) { inet_ntop(AF_INET6, (char*)&sin6->sin6_addr, buf, sizeof(buf)); } else { sin = (struct sockaddr_in *)&spc->spc_aaddr; inet_ntop(AF_INET, (char*)&sin->sin_addr, buf, sizeof(buf)); } printf("SCTP_PEER_ADDR_CHANGE: %s, addr=%s, assoc=%xh\n", str, buf, (uint32_t)spc->spc_assoc_id); break; case SCTP_REMOTE_ERROR: sre = &snp->sn_remote_error; printf("SCTP_REMOTE_ERROR: assoc=%xh\n", (uint32_t)sre->sre_assoc_id); break; case SCTP_SEND_FAILED: ssf = &snp->sn_send_failed; printf("SCTP_SEND_FAILED: assoc=%xh\n", (uint32_t)ssf->ssf_assoc_id); break; case SCTP_ADAPTION_INDICATION: { struct sctp_adaption_event *ae; ae = &snp->sn_adaption_event; printf("\nSCTP_adaption_indication bits:0x%x\n", (u_int)ae->sai_adaption_bits); } break; case SCTP_PARTIAL_DELIVERY_EVENT: { struct sctp_rcv_pdapi_event *pdapi; pdapi = &snp->sn_pdapi_event; printf("SCTP_PD-API event:%u\n", pdapi->pdapi_indication); if(pdapi->pdapi_indication == SCTP_PARTIAL_DELIVERY_ABORTED){ printf("PDI- Aborted\n"); } } break; case SCTP_SHUTDOWN_EVENT: sse = &snp->sn_shutdown_event; printf("SCTP_SHUTDOWN_EVENT: assoc=%xh\n", (uint32_t)sse->sse_assoc_id); break; default: printf("Unknown notification event type=%xh\n", snp->sn_type.type); } /* end switch(snp->sn_type) */ if(asocDown){ printf("Bring association back up\n"); len = sizeof(to); if(connect(fd,(struct sockaddr *)&to,len) == -1){ printf("Sorry connect fails %d\n",errno); } return(1); } return(0);} intmy_sctpReadInput(int fd){ /* receive some number of datagrams and * act on them. */ struct sctp_sndrcvinfo *s_info; int sz,i,disped; struct msghdr msg; struct iovec iov[2]; unsigned char from[200]; char readBuffer[65535]; char controlVector[65535]; disped = i = 0; s_info = NULL; iov[0].iov_base = readBuffer; iov[0].iov_len = sizeof(readBuffer); iov[1].iov_base = NULL; iov[1].iov_len = 0; msg.msg_name = (caddr_t)from; msg.msg_namelen = sizeof(from); msg.msg_iov = iov; msg.msg_iovlen = 1; msg.msg_control = (caddr_t)controlVector; msg.msg_controllen = sizeof(controlVector); errno = 0; sz = recvmsg(fd,&msg,0); if(sz <= 0){ printf("Read returns %d errno:%d control len is %d msgflg:%x\n", sz,errno, msg.msg_controllen,msg.msg_flags); } if (msg.msg_flags & MSG_NOTIFICATION) { return(my_handle_notification(fd,readBuffer)); }else{ printf("Huh, I got data?.. ignored (%d bytes)\n",sz); return(0); }}intclear_fds(int fd,int fd1){ int felldown; int max,notdone; fd_set readfds,writefds,exceptfds; struct timeval tv; memset(&tv,0,sizeof(tv)); FD_ZERO(&readfds); FD_ZERO(&writefds); FD_ZERO(&exceptfds); felldown = 0; FD_SET(fd,&readfds); FD_SET(fd1,&readfds); if(fd > fd1){ max = fd + 1; }else{ max = fd1 + 1; } notdone = 1; while(notdone){ select(max,&readfds,&writefds,&exceptfds,&tv); notdone = 0; if(FD_ISSET(fd,&readfds)){ notdone++; printf("clearing fd:%d\n",fd); felldown += my_sctpReadInput(fd); notdone = 1; } if(FD_ISSET(fd1,&readfds)){ notdone++; printf("clearing fd1:%d\n",fd1); felldown += my_sctpReadInput(fd1); } } return(felldown);}voidprocess_out_data(int fd,int fd1){ int notdone,x,ret; while(1){ /* Prepare the buffers */ prepare_buffers(); /* send out the 4 buffers */ ret = sendto(fd,buffer1,sizeof(buffer1),0, (struct sockaddr *)&to,sizeof(to)); if(ret < sizeof(buffer1)){ printf("Gak1, error:%d ret:%d\n",errno,ret); } ret = sendto(fd1,buffer2,sizeof(buffer1),0, (struct sockaddr *)&to,sizeof(to)); if(ret < sizeof(buffer2)){ printf("Gak2, error:%d ret:%d\n",errno,ret); } ret = sendto(fd,buffer3,sizeof(buffer1),0, (struct sockaddr *)&to,sizeof(to)); if(ret < sizeof(buffer3)){ printf("Gak3, error:%d ret:%d\n",errno,ret); } ret = sendto(fd1,buffer4,sizeof(buffer1),0, (struct sockaddr *)&to,sizeof(to)); if(ret < sizeof(buffer4)){ printf("Gak4, error:%d ret:%d\n",errno,ret); } /* now wait until we get a assoc failing */ notdone = 1; while(notdone){ x = clear_fds(fd,fd1); if(x){ notdone = 0; } sleep(1); } }}intmain(int argc, char **argv){ int i,fd,fd1; char *addr=NULL; uint16_t port=0; int protocol_touse = IPPROTO_SCTP; while((i= getopt(argc,argv,"p:h:")) != EOF){ switch(i){ case 'h': addr = optarg; break; case 'p': port = (uint16_t)strtol(optarg,NULL,0); break; }; } memset(&to,0,sizeof(to)); if((addr == NULL) || (port == 0)){ printf("Sorry you must specify a to addr -h addr\n"); return(-1); } if(inet_pton(AF_INET, addr, (void *) &to.sin_addr)){ to.sin_len = sizeof(to); to.sin_family = AF_INET; printf("port selected is %d\n",port); printf("addr %x\n",(u_int)ntohl(to.sin_addr.s_addr)); to.sin_port = htons(port); }else{ printf("Can't translate the address\n"); return(-1); } /**********************socket 1 *******************/ fd = socket(AF_INET, SOCK_SEQPACKET, protocol_touse); if(fd == -1){ printf("can't open socket:%d\n",errno); return(-1); } memset(&bindto,0,sizeof(bindto)); len = bindto.sin_len = sizeof(bindto); bindto.sin_family = AF_INET; bindto.sin_port = 0; if(bind(fd,(struct sockaddr *)&bindto, len) < 0){ printf("can't bind a socket:%d\n",errno); close(fd); return(-1); } if(getsockname(fd,(struct sockaddr *)&got,&len) < 0){ printf("get sockname failed err:%d\n",errno); close(fd); return(-1); } printf("fd uses port %d\n",ntohs(got.sin_port)); /**********************socket 2 *******************/ fd1 = socket(AF_INET, SOCK_SEQPACKET, protocol_touse); if(fd1 == -1){ printf("can't open socket:%d\n",errno); close(fd); return(-1); } memset(&bindto,0,sizeof(bindto)); len = bindto.sin_len = sizeof(bindto); bindto.sin_family = AF_INET; bindto.sin_port = 0; if(bind(fd1,(struct sockaddr *)&bindto, len) < 0){ printf("can't bind a socket:%d\n",errno); close(fd); close(fd1); return(-1); } if(getsockname(fd1,(struct sockaddr *)&got,&len) < 0){ printf("get sockname failed err:%d\n",errno); close(fd); close(fd1); return(-1); } printf("fd1 uses port %d\n",ntohs(got.sin_port)); if(connect(fd,(struct sockaddr *)&to,len) == -1){ printf("Sorry connect fails %d\n",errno); close(fd); return(-1); } if(connect(fd1,(struct sockaddr *)&to,len) == -1){ printf("Sorry connect fails %d\n",errno); close(fd); return(-1); } printf("Connected\n"); clear_fds(fd,fd1); process_out_data(fd,fd1); return(0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -