// receive callback void p2p_receive_handler(const char* data, uint32_t len, struct p2pconnection* p2pcon) { //struct p2pconnection* p2pcon = (struct p2pconnection*)arg; int fd = udp_sock_fd(p2pcon->ulsock, AF_INET); struct sa* lsa =NULL; lsa = (struct sa*)mem_zalloc(sizeof(struct sa),NULL); udp_local_get(p2pcon->ulsock, lsa); CUDT::postRecv(p2pcon->udtsock, &(lsa->u.sa), data, len); re_printf("p2p receive data:%s\n", data); }
// connect callback void p2p_request_handler(struct p2phandle *p2p, const char* peername, struct p2pconnection **p2pcon) { re_fprintf(stderr, "p2p accept from:%s\n", peername); int err = p2p_accept(p2p, p2pcon, peername, p2p_receive_handler, *p2pcon); int fdaccept = udp_sock_fd((*p2pcon)->ulsock, AF_INET); struct sa* lsa = NULL; lsa = (struct sa*)mem_zalloc(sizeof(struct sa),NULL); udp_local_get((*p2pcon)->ulsock, lsa); sa_cpy(lsa, p2p->sactl); int fdlisten = tcp_conn_fd(p2p->ltcp); UDPSOCKET udpsock = (UDPSOCKET)fdlisten; (*p2pcon)->udtsock = CUDT::socket(AF_INET, SOCK_STREAM, 0); CUDT::bind((*p2pcon)->udtsock, &udpsock, &(p2p->sactl->u.sa), p2p->sactl->len); CUDT::listen((*p2pcon)->udtsock, &(lsa->u.sa), 10); if (err) { re_fprintf(stderr, "p2p accept error:%s\n", strerror(err)); return ; } }
static void print_udp_bufsize(int af) { struct udp_sock *us = NULL; struct sa laddr; int fd; int sndbuf; int rcvbuf; socklen_t sndbuf_len = sizeof(sndbuf); socklen_t rcvbuf_len = sizeof(rcvbuf); int err; sa_init(&laddr, af); err = udp_listen(&us, &laddr, NULL, NULL); if (err) { warning("test: udp_listen failed (%m)\n", err); goto out; } fd = udp_sock_fd(us, af); if (-1 == fd) { warning("test: no udp socket fd\n"); goto out; } getsockopt(fd, SOL_SOCKET, SO_SNDBUF, &sndbuf, &sndbuf_len); getsockopt(fd, SOL_SOCKET, SO_RCVBUF, &rcvbuf, &rcvbuf_len); re_printf("test: udp socket buffersize for %-8s:" " SO_SNDBUF=%d SO_RCVBUF=%d\n", net_af2name(af), sndbuf, rcvbuf); out: mem_deref(us); }