Example #1
0
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;
}