int main(void) { UDPTerm udp; int i; int msglen; char buf[512]; if(open_udp_client(&udp, 1)) diep("udpClient_Init"); for (i=0; i<10; i++) { printf((char*)"Sending packet %d\n", i); msglen=sprintf(buf, (char*)"This is packet %d\n", i); if (udp_send(&udp, buf, msglen+1, "192.168.1.1", 9930, NULL) == -1) diep("send"); usleep(100000); } close_udp(&udp); return 0; }
/************************************************************************* * Function name: Client::discover * Description: Function for discover in class Client using UDP * Parameter: const void * buffer_obj //pointer to discover objective * Return: ERRNO * Remark: * Lastly modified by Kangning Xu on 15-5-25 *************************************************************************/ ERRNO Client::discover() { // Client std::cout << "discovery start!!" << std::endl; ERRNO rtnval; int sock = socket(AF_INET6,SOCK_DGRAM,0); if(sock < 0) { dieWithUserMessager("socket failed"); } int broadcastPerm = 1; if(setsockopt(sock,SOL_SOCKET,SO_BROADCAST,&broadcastPerm,sizeof(broadcastPerm)) < 0) { dieWithUserMessager("set sockopt failed"); } session_id= generate_random()%(MAX_SESSION_ID+1); // send a discover request enum MSG_TYPE type; char buffer[MAXSTRINGLENGTH]; Objective_Option obj_opt(Discovery, 0, (uint8_t*)"",0,0); uint16_t * bits = obj_opt.to_bits(); memcpy(buffer, bits, Objective_Option::len_except_value); client_udp_init(sock, "ff02::1", serverAddr); //std::cout<<"ready to send:"<<std::endl; rtnval = send(buffer, strlen(buffer), DISCOVERY_MSG); if(rtnval != SUCCESS) { dieWithUserMessager("sendto failed"); //std::cout<<rtnval<<std::endl; return rtnval; } // waiting for response //rtnval = m.nrecvfrom(nsock,session_id,buffer,type); rtnval = recv(buffer,type); if(rtnval == SUCCESS) { cur_states = OFF; close(sock); close_udp(); } if(rtnval != SUCCESS) { dieWithUserMessager("recv failed"); } else { if(type == RESPONSE_MSG) { Option recved_opt = Option::parse_bits((uint16_t *)buffer); option_type type = recved_opt.get_type(); char * recved_addr; if(type == Locator) { recved_addr = (char*)recved_opt.get_value(); std::cout<<"Server ip6: "<< recved_addr << std::endl; inet_pton(AF_INET6, recved_addr, &negoAddr.sin6_addr); // struct in6_addr ip = negoAddr.sin6_addr; // printf("0x%x%x%x%x\n", htonl(ip.s6_addr32[0]),htonl(ip.s6_addr32[1]),htonl(ip.s6_addr32[2]),htonl(ip.s6_addr32[3])); // char s[64]={"\0"}; // inet_ntop(AF_INET6,(void*)&ip,s,64); // std::cout <<"sin6_addr "<< s << std::endl; } else return ERROR; } // Option recved_opt = Option::parse_bits((uint16_t *)buffer); // std::cout <<"type "<< recved_opt.get_type() <<std::endl // <<"len "<< recved_opt.get_len() << std::endl // <<"value "<< (char*)recved_opt.get_value() << std::endl; } // strcpy((char *)buffer_obj,(char*)recved_opt.get_value()); std::cout << "dicovery end!!" <<std::endl; //m.nclose("",0); return SUCCESS; }