struct peer* peer_exists_simple(const char* addr, unsigned short port) { if(!addr || !port) return NULL; struct peer* sp=peer_new(); strncpy(sp->addr, addr, IPV4_MAX); sp->port=port; struct peer* ret=peer_exists(sp); peer_remove(sp); return ret; }
struct peer * peer_connect(struct net *net, const char *node, int port) { struct addrinfo hints; struct addrinfo *result; struct peer *peer; char sport[6]; int error; int s; memset(&hints, 0, sizeof(struct addrinfo)); snprintf(sport, 6, "%d", port); #ifndef IPV6 hints.ai_family = AF_INET; #endif hints.ai_flags = AI_ALL; error = getaddrinfo(node, sport, &hints, &result); if(error != 0) { fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(error)); return NULL; } s = socket(result->ai_family, SOCK_STREAM, IPPROTO_TCP); if(s < 0) return NULL; if(connect(s, result->ai_addr, result->ai_addrlen) < 0) return NULL; freeaddrinfo(result); /* if we got an IPv4 address we need to convert it to mapped v4 format */ /* this is only for internal representation now when the connection * has been established */ peer = peer_new(net, s, node, port); if(peer_start_handshake(peer) != 0) return NULL; return peer; }
//create udp connect socket struct peer* peer_udp_create(const char *dstip, unsigned short dstport, unsigned short srcport) { int ret; struct peer* peer; int socklen; struct sockaddr_in sin; char buf[256]; peer = peer_new(); if (NULL == peer) return NULL; //init the src union memset(&sin, 0, sizeof(struct sockaddr_in)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = htonl(INADDR_ANY); sin.sin_port = htons(srcport); socklen = sizeof(struct sockaddr_in); #ifdef HAVE_SIN_LEN sin.sin_len = socklen; #endif peer->su.sin = sin; //init the dst unsion memset(&sin, 0, sizeof(struct sockaddr_in)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = inet_addr(dstip); inet_ntop(AF_INET, &sin.sin_addr, buf, 256); //fprintf(stderr, "convert from dstip %s address to union address success\n", buf); sin.sin_port = htons(dstport); socklen = sizeof(struct sockaddr_in); #ifdef HAVE_SIN_LEN sin.sin_len = socklen; #endif peer->dsu.sin = sin; peer->type = TYPE_UDP; peer->mode = MODE_CONNECT; return peer; }
/* Hello */ static void hello (void *m) { msg_s *msg = m; ki_t share_key = msg->q.q_passed_key; ki_t peer_key; peer_s *peer; int rc; FN; peer = peer_new(); peer->pr_type = &Peer_type.tp_tag; peer->pr_share_key = share_key; peer_key = make_gate(peer, RESOURCE | PASS_ANY); if (!peer_key) { free(peer); return; } msg->q.q_passed_key = peer_key; msg->m_method = SHARE_PEER; rc = send_key_tau(share_key, msg); if (rc) { destroy_key_tau(peer_key); } }
static void* run_discovery(void* data) { discovery_opts_t* opts = (discovery_opts_t*)data; char ip[INET_ADDRSTRLEN] = { '\0' }; const char* interface = opts->interface; udp_t *udp = udp_new(PING_PORT_NUMBER, interface); assert(udp); struct pollfd ufds[1]; int ret; time_t t0, t1; beacon_t beacon; uuid_t uuid; beacon_t recv; peers_t* peers = peers_new(); struct in_addr addr; find_my_ip(&addr, NULL); uuid_generate(uuid); beacon_fill(&beacon, (uint8_t*)BEACON_PROTOCOL, BEACON_VERSION, uuid, addr, htons(47473)); ufds[0].fd = udp_handle(udp); ufds[0].events = POLLIN; t0 = time(NULL); t1 = time(NULL); struct sockaddr_in sockaddr; socklen_t si_len = sizeof(struct sockaddr_in); while (1) { t1 = time(NULL); if ((long)(t1 - t0) >= PING_INTERVAL) { ret = udp_send(udp, (uint8_t*)(&beacon), sizeof(beacon_t)); assert(ret == sizeof(beacon_t)); t0 = time(NULL); } ret = poll(ufds, 1, 200); if (ret == -1) { printf("Error: poll returned -1\n"); break; } else if (ret == 0) { continue; } if (ufds[0].revents & POLLIN) { ret = udp_recv(udp, (uint8_t*)&recv, sizeof(beacon_t), &sockaddr, si_len); if (ret == sizeof(beacon_t) && beacon_check(&recv, (uint8_t*)BEACON_PROTOCOL, BEACON_VERSION)) { if (uuid_compare(uuid, recv.uuid) != 0) { peer_t* peer = peers_exist(peers, recv.uuid); if (!peer) { inet_ntop(sockaddr.sin_family, &sockaddr.sin_addr, ip, INET_ADDRSTRLEN); peer = peer_new(recv.uuid, ip, recv.port); peers_add(peers, peer); opts->add_peer_cb((void*)peer); } peer_is_alive(peer); } } } peers_check(peers); } peers_destroy(&peers); udp_destroy(&udp); return NULL; }