void receive_file(struct packet* hp, struct packet* data, int sfd, FILE* f) { int x; int i = 0, j = 0; if((x = recv(sfd, data, size_packet, 0)) <= 0) er("recv()", x); j++; hp = ntohp(data); printpacket(hp, HP); // 当在数据传输的时候 type字段会用来标示是否 while(hp->type == DATA) { // 将收到的数据写入文件,二进制写入方式 i += fwrite(hp->buffer, 1, hp->datalen, f); if((x = recv(sfd, data, size_packet, 0)) <= 0) er("recv()", x); j++; hp = ntohp(data); printpacket(hp, HP); } fprintf(stderr, "\t%d data packet(s) received.\n", --j); // j decremented because the last packet is EOT. fprintf(stderr, "\t%d byte(s) written.\n", i); if(hp->type == EOT) return; else { fprintf(stderr, "Error occured while downloading remote file.\n"); exit(2); } fflush(stderr); }
static void recvpacket(int sock, int recvmsg_flags, int siocgstamp, int siocgstampns) { char data[256]; struct msghdr msg; struct iovec entry; struct sockaddr_in from_addr; struct { struct cmsghdr cm; char control[512]; } control; int res; memset(&msg, 0, sizeof(msg)); msg.msg_iov = &entry; msg.msg_iovlen = 1; entry.iov_base = data; entry.iov_len = sizeof(data); msg.msg_name = (caddr_t)&from_addr; msg.msg_namelen = sizeof(from_addr); msg.msg_control = &control; msg.msg_controllen = sizeof(control); res = recvmsg(sock, &msg, recvmsg_flags|MSG_DONTWAIT); if (res < 0) { printf("%s %s: %s\n", "recvmsg", (recvmsg_flags & MSG_ERRQUEUE) ? "error" : "regular", strerror(errno)); } else { printpacket(&msg, res, data, sock, recvmsg_flags, siocgstamp, siocgstampns); } }
void checkpackets() // check for and process packets { PacketReceivePacket(lpAdapter,lpPacket,TRUE); char *data; data = (char *)lpPacket->Buffer; int tbytes; tbytes = lpPacket->ulBytesReceived; int reader = 0; while(reader < tbytes) { bpf_hdr *header; header=(struct bpf_hdr *)(data+reader); int datalength = header->bh_datalen; int totallength = header->bh_caplen; reader = reader + header->bh_hdrlen; char *readme; readme = data+reader; printpacket((unsigned char *)readme, datalength); reader = Packet_WORDALIGN(reader+datalength); } }
int main(int argc, char *argv[]) { //memcpy(self_client_id, "qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", 32); if (argc < 4) { printf("usage %s ip port client_id(of friend to find ip_port of)\n", argv[0]); exit(0); } DHT_addfriend((uint8_t *)argv[3]); //initialize networking //bind to ip 0.0.0.0:PORT IP ip; ip.i = 0; init_networking(ip, PORT); int randdomnum = random_int(); memcpy(self_client_id, &randdomnum, 4); perror("Initialization"); IP_Port bootstrap_ip_port; bootstrap_ip_port.port = htons(atoi(argv[2])); //bootstrap_ip_port.ip.c[0] = 127; //bootstrap_ip_port.ip.c[1] = 0; //bootstrap_ip_port.ip.c[2] = 0; //bootstrap_ip_port.ip.c[3] = 1; bootstrap_ip_port.ip.i = inet_addr(argv[1]); DHT_bootstrap(bootstrap_ip_port); IP_Port ip_port; uint8_t data[MAX_UDP_PACKET_SIZE]; uint32_t length; while(1) { doDHT(); while(receivepacket(&ip_port, data, &length) != -1) { if(DHT_handlepacket(data, length, ip_port)) { //unhandled packet printpacket(data, length, ip_port); } else { printf("Received handled packet with length: %u\n", length); } } print_clientlist(); print_friendlist(); c_sleep(300); } shutdown_networking(); return 0; }
/* recieve packets and send them to the packethandler * run doLossless_UDP(); */ void Lossless_UDP() { IP_Port ip_port; uint8_t data[MAX_UDP_PACKET_SIZE]; uint32_t length; while (receivepacket(&ip_port, data, &length) != -1) { //if(rand() % 3 != 1)//add packet loss //{ if (LosslessUDP_handlepacket(data, length, ip_port)) { printpacket(data, length, ip_port); } else { //printconnection(0); printf("Received handled packet with length: %u\n", length); } //} } doLossless_UDP(); }
// the operation of GET file command void command_get(struct packet* shp, struct packet* data, int sfd_client, char* lpwd) { int x; FILE* f = fopen(shp->buffer, "rb"); shp->type = INFO; shp->comid = GET; strcpy(shp->buffer, f ? "OK: File found; processing..." : "ER: Error opening file."); printpacket(shp, HP); data = htonp(shp); if(( x = send(sfd_client, data, size_packet, 0)) != size_packet) er("send()", x); if(f) { shp->type = DATA; //send_file(shp, data, sfd_client, f); send_file(shp, data, sfd_server_data, f); fclose(f); } send_EOT(shp, data, sfd_server_data); //send_EOT(shp, data, sfd_client); }
// the operation of PRT command void command_prt(struct packet* shp, struct packet* data, int sfd_client, char* lpwd) { if(DEBUG) printf("Starting prt...\n"); int x; int dataportnum = atoi(shp->buffer); shp->type = INFO; shp->comid = PRT; strcpy(shp->buffer, dataportnum ? "OK: Port Gotten; processing..." : "ER: Error getting port num."); printpacket(shp, HP); data = htonp(shp); if(( x = send(sfd_client, data, size_packet, 0)) != size_packet) er("send()", x); if(DEBUG) printf("OK, waiting for connection\n"); if(dataportnum) { struct sockaddr_in skin_server_data; int x; size_t size_sockaddr = sizeof(struct sockaddr), size_packet = sizeof(struct packet); if(( x = sfd_server_data = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) er("socket()", x); memset((char*) & skin_server_data, 0, sizeof(struct sockaddr_in)); skin_server_data.sin_family = AF_INET; skin_server_data.sin_addr.s_addr = inet_addr(IPCLIENT); skin_server_data.sin_port = htons(dataportnum); if(( x = connect(sfd_server_data, (struct sockaddr*) &skin_server_data, size_sockaddr)) < 0) er("connect()", x); printf(ID "Data channel build. Communicating with client @ %s:%d...\n\n", IPCLIENT, dataportnum); } send_EOT(shp, data, sfd_client); }
int main(int argc, char *argv[]) { //memcpy(self_client_id, "qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", 32); if (argc < 4) { printf("usage %s ip port public_key\n", argv[0]); exit(0); } new_keys(); printf("OUR ID: "); uint32_t i; for(i = 0; i < 32; i++) { if(self_public_key[i] < 16) printf("0"); printf("%hhX",self_public_key[i]); } char temp_id[128]; printf("\nEnter the client_id of the friend you wish to add (32 bytes HEX format):\n"); if(scanf("%s", temp_id) != 1) exit(0); DHT_addfriend(hex_string_to_bin(temp_id)); /* initialize networking */ /* bind to ip 0.0.0.0:PORT */ IP ip; ip.i = 0; init_networking(ip, PORT); perror("Initialization"); IP_Port bootstrap_ip_port; bootstrap_ip_port.port = htons(atoi(argv[2])); /* bootstrap_ip_port.ip.c[0] = 127; * bootstrap_ip_port.ip.c[1] = 0; * bootstrap_ip_port.ip.c[2] = 0; * bootstrap_ip_port.ip.c[3] = 1; */ bootstrap_ip_port.ip.i = inet_addr(argv[1]); DHT_bootstrap(bootstrap_ip_port, hex_string_to_bin(argv[3])); IP_Port ip_port; uint8_t data[MAX_UDP_PACKET_SIZE]; uint32_t length; while(1) { doDHT(); while(receivepacket(&ip_port, data, &length) != -1) { if(DHT_handlepacket(data, length, ip_port) && friendreq_handlepacket(data, length, ip_port)) { //unhandled packet printpacket(data, length, ip_port); } else { printf("Received handled packet with length: %u\n", length); } } print_clientlist(); print_friendlist(); c_sleep(300); } shutdown_networking(); return 0; }
int main (int argc, char **argv) { unsigned int daddr = inet_addr(argv[1]); // transforma o segundo parametro no formato de endereço de IP int sockfd = socket(AF_INET, SOCK_RAW, 48); //Cria file descriptor do socket if (sockfd < 0){ //Verifica criação do file descriptor perror("could not create socket"); return 0; } int on = 1;//Variável auxiliar na definição de opções //Seleciona opção HDRINCL, que significa que o header IP estará incluso no pacote if (setsockopt (sockfd, IPPROTO_IP, IP_HDRINCL, (const char*)&on, sizeof(on)) == -1){ perror("setsockopt"); return 0; } if (setsockopt (sockfd, SOL_SOCKET, SO_BROADCAST, (const char*)&on, sizeof(on)) == -1){ perror("setsockopt"); return 0; } //source ip struct ifreq ifr;//interface usada para configurar network devices ifr.ifr_addr.sa_family = AF_INET;//Usaremos da estrutura if_addr dentro da estrutura ifreq ioctl(sockfd, SIOCGIFADDR, &ifr); char* packet = (char*) malloc(MAX_LEN);//Aloca espaço para o pacote //Cria ponteiros das estruturas utilizadas no pacote e ajusta suas localizações struct iphdr* ip = (struct iphdr*) packet; memset(packet, 0, MAX_LEN);//Inicia pacote int packet_size = create_routerqt(packet, daddr, inet_addr("0.0.0.0")); ip->version = 4; ip->ihl = 5; ip->tos = 0; ip->tot_len = htons(packet_size); ip->id = 0; ip->frag_off = 0; ip->ttl = 10; ip->protocol = 48; FILE* f; struct sockaddr_in servaddr; char a[20], b[20]; f = fopen("redes.txt", "r"); unsigned int addr, mask; while(fscanf(f, "%s%s", a, b)!= EOF) { rmaddr_routerqt(packet); addr = inet_addr(a), mask = inet_addr(b); int packet_size = addaddr_routerqt(packet, addr); ip = (struct iphdr*) packet; ip->saddr = addr; ip->daddr = (~mask)|addr; ip->check = checksum((unsigned short*) packet, sizeof(struct iphdr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = ip->daddr; memset(&servaddr.sin_zero, 0, sizeof (servaddr.sin_zero)); printf("\n\n"); printpacket((unsigned char*) packet, packet_size); if (sendto(sockfd, packet, packet_size, 0, (struct sockaddr*) &servaddr, sizeof (servaddr)) < 1)//Envia pacote e verifica envio { perror("send failed"); } } fclose(f); printf("enviada\n"); free(packet); close(sockfd); return 0; }
udp_pair * udpdotrace( struct ip *pip, struct udphdr *pudp, void *plast) { udp_pair *pup_save; ucb *thisdir; ucb *otherdir; udp_pair tp_in; int dir; u_short uh_sport; /* source port */ u_short uh_dport; /* destination port */ u_short uh_ulen; /* data length */ /* make sure we have enough of the packet */ if ((char *)pudp + sizeof(struct udphdr)-1 > (char *)plast) { if (warn_printtrunc) fprintf(stderr, "UDP packet %lu truncated too short to trace, ignored\n", pnum); ++ctrunc; return(NULL); } /* convert interesting fields to local byte order */ uh_sport = ntohs(pudp->uh_sport); uh_dport = ntohs(pudp->uh_dport); uh_ulen = ntohs(pudp->uh_ulen); /* make sure this is one of the connections we want */ pup_save = FindUTP(pip,pudp,&dir); ++packet_count; if (pup_save == NULL) { return(NULL); } ++udp_trace_count; /* do time stats */ if (ZERO_TIME(&pup_save->first_time)) { pup_save->first_time = current_time; } pup_save->last_time = current_time; // Lets not waste any more CPU cycles if we are ignoring this connection. if (pup_save->ignore_pair) return (pup_save); /* save to a file if requested */ if (output_filename) { PcapSavePacket(output_filename,pip,plast); } /* now, print it if requested */ if (printem && !printallofem) { printf("Packet %lu\n", pnum); printpacket(0, /* original length not available */ (char *)plast - (char *)pip + 1, NULL,0, /* physical stuff not known here */ pip,plast,NULL); } /* grab the address from this packet */ CopyAddr(&tp_in.addr_pair, pip, uh_sport, uh_dport); /* figure out which direction this packet is going */ if (dir == A2B) { thisdir = &pup_save->a2b; otherdir = &pup_save->b2a; } else { thisdir = &pup_save->b2a; otherdir = &pup_save->a2b; } /* do data stats */ thisdir->packets += 1; thisdir->data_bytes += uh_ulen; /* total packets stats */ ++pup_save->packets; return(pup_save); }