/*设置ICMP报头*/ int pack(int pack_no) { int i,packsize; struct icmp *icmp; struct timeval *tval; icmp=(struct icmp*)sendpacket; icmp->icmp_type=ICMP_ECHO; icmp->icmp_code=0; icmp->icmp_cksum=0; icmp->icmp_seq=pack_no; icmp->icmp_id=pid; packsize=8+datalen; tval= (struct timeval *)icmp->icmp_data; gettimeofday(tval,NULL); /*记录发送时间*/ icmp->icmp_cksum=cal_chksum( (unsigned short *)icmp,packsize); /*校验算法*/ return packsize; }
/*设置ICMP报头*/ int pack(int pack_no,char icmp_hd[]) { int i,packsize; struct icmp *icmp; struct timeval *tval; icmp=(struct icmp*)icmp_hd; icmp->icmp_type=ICMP_ECHO; icmp->icmp_code=0; icmp->icmp_cksum=0; icmp->icmp_seq=pack_no; icmp->icmp_id=9; packsize=200; //发送的报文长度 tval=(struct timeval *)icmp->icmp_data; gettimeofday(tval,NULL); //记录发送时间 icmp->icmp_cksum=cal_chksum((unsigned short *)icmp,packsize); //校验算法 return packsize; }
int pack(int pack_no, char *sendpacket, pid_t pid) { int packet_size; struct icmp *icmp; struct timeval *tval; icmp = (struct icmp*)sendpacket; icmp->icmp_type = ICMP_ECHO; icmp->icmp_code = 0; icmp->icmp_cksum = htons(0); icmp->icmp_seq = htons(pack_no); icmp->icmp_id = htons(pid); packet_size = PINGS_ICMP_HEADER_SIZE + PINGS_ICMP_DEFAULT_DATA_SIZE; tval = (struct timeval *)icmp->icmp_data; gettimeofday(tval, NULL); icmp->icmp_cksum = cal_chksum((unsigned short *)icmp, packet_size); return packet_size; }
int write_new_file(char *file_buf, int file_len) { puts("==================================="); puts("recv:"); t_disbuf(file_buf, file_len); puts("==================================="); int tmp_len = 0; int fname_len = 0; int fdata_len = 0; int write_len = 0; char fname[256] = {0}; char fdata[4096] = {0}; unsigned short chk_src = 0; unsigned short chk_dst = 0; memcpy(&fname_len, file_buf, sizeof(int)); memcpy(fname, file_buf + sizeof(int), fname_len); memcpy(&fdata_len, file_buf + sizeof(int) + fname_len, sizeof(int)); memcpy(fdata, file_buf + 2*sizeof(int) + fname_len, fdata_len); memcpy(&chk_src, file_buf + 2*sizeof(int) + fname_len + fdata_len, sizeof(short)); chk_dst = cal_chksum( (unsigned short *)fdata, fdata_len); /*校验算法*/ printf("chksum is:%d\n", chk_dst); if (chk_src != chk_dst) { printf("file has not completely transfered\n"); return -1; } else printf("start to recive file\n"); printf("fname is:%s\n", fname); puts("==================================="); puts("fdata:"); t_disbuf(fdata, fdata_len); puts("==================================="); FILE *fp = fopen(fname, "w+"); if (fp == NULL) { printf("File:\t%s Can Not Open To Write!\n", fname); return -1; } while (tmp_len < fdata_len) { write_len = fwrite(fdata, sizeof(char), fdata_len, fp); tmp_len = tmp_len + write_len; } fclose(fp); return 1; }