static int _reg_and_bind(struct udp_socket *c, void *ptr, udp_socket_input_callback_t cb, uint16_t port) { if (udp_socket_register(c, ptr, cb) < 0) { return -EMFILE; } if (udp_socket_bind(c, port) < 0) { udp_socket_close(c); return -EALREADY; } return 0; }
/*---------------------------------------------------------------------------*/ PROCESS_THREAD(multicast_example_process, ev, data) { PROCESS_BEGIN(); /* Create a linkl-local multicast addresses. */ uip_ip6addr(&addr, 0xff02, 0, 0, 0, 0, 0, 0x1337, 0x0001); /* Join local group. */ if(uip_ds6_maddr_add(&addr) == NULL) { printf("Error: could not join local multicast group.\n"); } /* Register UDP socket callback */ udp_socket_register(&s, NULL, receiver); /* Bind UDP socket to local port */ udp_socket_bind(&s, PORT); /* Connect UDP socket to remote port */ udp_socket_connect(&s, NULL, PORT); while(1) { /* Set up two timers, one for keeping track of the send interval, which is periodic, and one for setting up a randomized send time within that interval. */ etimer_set(&periodic_timer, SEND_INTERVAL); etimer_set(&send_timer, (random_rand() % SEND_INTERVAL)); PROCESS_WAIT_UNTIL(etimer_expired(&send_timer)); printf("Sending multicast\n"); udp_socket_sendto(&s, "hello", 6, &addr, PORT); PROCESS_WAIT_UNTIL(etimer_expired(&periodic_timer)); } PROCESS_END(); }
/*---------------------------------------------------------------------------*/ int propple_socket_open(struct propple_socket *s, void *ptr, propple_socket_input_callback_t callback, uint16_t port, clock_time_t interval, clock_time_t interval_max, uint8_t duptheshold) { s->ptr = ptr; s->callback = callback; s->interval = interval; s->interval_max = interval_max; s->duptheshold = duptheshold; s->port = port; s->duplicates = 0; s->interval_scaling = 0; /* Register UDP socket callback */ if(udp_socket_register(&s->s, s, recv) == 0) { printf("propple_socket_open: udp_socket_register failed\n"); return 0; } /* Bind UDP socket to local port */ if(udp_socket_bind(&s->s, port) == 0) { printf("propple_socket_open: udp_socket_bind failed\n"); return 0; } /* Connect UDP socket to remote port */ if(udp_socket_connect(&s->s, NULL, port) == 0) { printf("propple_socket_open: udp_socket_connect failed\n"); return 0; } return 1; }
static int _reg(struct udp_socket *c, void *ptr, udp_socket_input_callback_t cb, const sock_udp_ep_t *local, const sock_udp_ep_t *remote) { if (((local != NULL) && (local->family != AF_INET6)) || ((remote != NULL) && (remote->family != AF_INET6))) { return -EAFNOSUPPORT; } if (udp_socket_register(c, ptr, cb) < 0) { return -ENOMEM; } if (local != NULL) { if (udp_socket_bind(c, local->port) < 0) { udp_socket_close(c); return -EADDRINUSE; } } if (remote != NULL) { /* check of return value not necessary, since neither c nor * c->udp_conn is NULL (only error case) at this point */ udp_socket_connect(c, (uip_ipaddr_t *)&remote->addr, remote->port); } return 0; }
void init_udp() { udp_socket_register(&client_sock,0,&udp_data_received); udp_socket_bind(&client_sock, 3001); }