⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 peel_client.c

📁 用来测试网络的软件,希望大家一起来测试。
💻 C
📖 第 1 页 / 共 2 页
字号:
			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 + -