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

📄 udp_send.c

📁 udp发送,在vpn环境下
💻 C
字号:
#include <stdio.h>#include <string.h>#include <sys/socket.h>#include <arpa/inet.h>#include <fcntl.h>#include <netdb.h>#include <linux/types.h>#include <malloc.h>#include <unistd.h>#include <stdlib.h>#include <sys/ioctl.h>#define DEST_IP  "10.5.1.7"#define MY_IP  "10.214.50.252"#define PORT 1701#define TUNNELID 21494	#define SESSIONID 1557#define SIZE 1024/*the global var */char hostname[256];int server_socket;unsigned int listen_addy=INADDR_ANY;struct sockaddr_in server,to;char pck[100]="40 02 00 1c 57 7a a8 d1 ff 03 c0 21 05 08 00 10 26 59 7e 30 00 3c cd 74 00 00 00 00";/*some important header*/struct lcp{	char code;	char identifier;	short length;}t;struct ppp{	char address;	char control;	short protocol;};struct l2tp{	char  packet_type;	short length;	short tunnel_id;	short session_id;};struct buffer{	int  type;	void *start;	void *begin;	void *end ;	int len;	int maxlen;};struct buffer *new_buff(int size){    struct buffer *b = (struct buffer *)malloc (sizeof (struct buffer));/*a buffer with fixed begin buffer->begin and fixed end buffer->end  the real start is buffer->start the real length is buffer->lenthe max length is buffer->maxlenconsideration of tcp/ip stack model*/    b->start = malloc (size);    if (!b->start)    {        free (b);        return NULL;    }    b->begin= b->start;    b->end = b->start + size - 1;    b->start=b->end;    b->len = 0;    b->maxlen = size;    return b;}int add_l2tpheader(struct buffer * buff){	struct l2tp * p=NULL;	char *ptr=NULL;	buff->start-=sizeof(struct l2tp);	buff->len+=sizeof(struct l2tp);		p=(struct l2tp *)buff->start;	/*p->packet_type=0x4002 was raw idea*/	ptr=(char *)&(p->packet_type);	*ptr=0x40;ptr++;	*ptr=0x02;	p->length=htons(28);	p->tunnel_id=htons(TUNNELID);	p->session_id=htons(SESSIONID);	printf("----%d----\n",buff->end-buff->start);	return 0;}int add_pppheader(struct buffer * buff){	struct ppp *p=NULL;	char *ptr=NULL;	/*stuff the ppp header*/	buff->start-=sizeof(struct ppp);	buff->len+=sizeof(struct ppp);	p=(struct ppp *)buff->start;	p->address=0xff;	p->control=0x03;		/*p->protocol=htonl(0xc021); is the raw idea */	ptr=(char *)&(p->protocol);	*ptr=0xc0;ptr++;	*ptr=0x21;			printf("----%d----\n",buff->end-buff->start);	return 0;}int add_lcpheader(struct buffer * buff){	int lcp_last[8]={0,60,205,116,0,0,0,0};	int lcp_last_[4]={23,51,99,84};	struct lcp *p=NULL;	char *ptr=NULL;	int i=0;		/*stuff the data fields with all zero*/	buff->start-=12;	buff->len+=12;	ptr=(char *)buff->start;	/*stuff the end of lcp data*/	for (i=0;i<4;i++){*ptr=lcp_last_[i];ptr++;}/*zero is terperary ,i don't know the real mean of the field*/	for (i=0;i<8;i++)		{			*ptr=0;			*ptr+=lcp_last[i];ptr++;		}//	strcpy(buff->start,tmp);		/*stuff the lcp header*/	buff->start-=sizeof(struct lcp);	buff->len+=sizeof(struct lcp);	p=(struct lcp*)buff->start;	p->code=0x05;	p->identifier=0x08;	p->length=htons(16);	printf("----%d----\n",buff->end-buff->start);	return 0;}int _packet_send (struct buffer  * buff, struct sockaddr_in  to){	int a=0;		if ((a=add_lcpheader(buff))){printf("error at lcp%d\n",a);}	printf("add packet header lcp sucessfully!\n");	if (add_pppheader(buff)!=0){printf("error at ppp\n");}	printf("add packet header ppp sucessfully!\n");	if (add_l2tpheader(buff)!=0){printf("error at l2tp\n");}	printf("add packet header l2tp sucessfully!\n");	printf("the buffer data is %s\n",buff->start);	char tmp[100]="abcd";	for (a=0;a<10;a++)	if((a=sendto(server_socket,buff->start,buff->len,0,(struct sockaddr *)&to,sizeof(to)))==-1){printf("socket send function error!\n");return 6;}	//if(a=sendto(server_socket,tmp,sizeof(tmp),0,(struct sockaddr *)&to,sizeof(to))){printf("socket send function error!---%d\n",a);return 6;}		/*	for (int i=0;i<65000;i++)		{			if (add_l2tpheader(buff)){printf("error at l2tp\n");return 3;}			if(sendto(socket,buff,sizeof(buff),0,to)){printf("error at lcp\n");return 6;}		}*/	return 0;}int packet_send(struct buffer * buff,struct sockaddr_in to){	int a=0;	int tmp=0;	char c=' ';/*tmp char to save the var*/	buff->start-=28;	char *p=(char *)buff->start;	buff->len=28;	for(a=0;a<strlen(pck);a+=3)	{				sscanf(pck+a,"%x",&tmp);		c=0;		c+=tmp;		*p=c;		p++;	}	/*printf("%x\n",buff->start);*/	if((a=sendto(server_socket,buff->start,buff->len,0,(struct sockaddr *)&to,sizeof(to)))==-1){printf("socket send function error!---%d\n",a);return 6;}}int init_network (void){ 	long arg;	int length = sizeof (server);	/*destnation address family,ip and port*/	to.sin_family = AF_INET;	to.sin_addr.s_addr = (inet_addr(DEST_IP));//htonl 	to.sin_port = htons (PORT);	    	/*    struct   hostent   *ht=NULL; 	gethostname (hostname, sizeof (hostname));	    	ht=gethostbyname(const   char   *hostname);   ht->h_addr_list[0]*/		/*set the send's address family ,ip and port*/	    server.sin_family = AF_INET;    server.sin_addr.s_addr = htonl (inet_addr(MY_IP));/*set a statical ip address*/    server.sin_port = htons (PORT);/*create socket, bind and test*/    if ((server_socket = socket (PF_INET, SOCK_DGRAM, 0)) < 0)    {    	printf("socket create error\n");        return -1;    };	    if (arg=bind (server_socket, (struct sockaddr *) &server, sizeof(server)))    {    	 printf("%d----%d-----%d\n",server.sin_family,server.sin_port,server.sin_addr.s_addr);   	 printf("%d----%d----%d\n",to.sin_family,to.sin_port,to.sin_addr.s_addr);    	 printf("socket bind error%d---\n",arg);        close (server_socket);        return -1;    };    if (getsockname (server_socket, (struct sockaddr *) &server, &length))    {    	printf("socket test error\n");        return -1;    }	/*set the file flags*/    arg = fcntl (server_socket, F_GETFL);/*get file flag*/    arg |= O_NONBLOCK;/*non block type */    fcntl (server_socket, F_SETFL, arg);/*set the file flag*/	    return 0;}int main(){		int type=0;	struct buffer *buff;	buff=new_buff(SIZE);	printf("network init.  waiting ........\n");	if(init_network()){return -1;}	printf("initial is ok\n");	_packet_send(buff,to);	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -