📄 udp_send.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 + -