static void on_read(int fd, void *arg) { struct rpc *r = (struct rpc *)arg; char out_arg[1024]; struct iovec *recv_buf; uint32_t msg_id; size_t out_len; memset(&r->recv_pkt, 0, sizeof(struct rpc_packet)); recv_buf = rpc_recv_buf(r); if (!recv_buf) { loge("rpc_recv_buf failed!\n"); return; } struct rpc_packet *pkt = &r->recv_pkt; unpack_msg(pkt, &msg_id, &out_arg, &out_len); logi("msg_id = %08x\n", msg_id); if (r->state == rpc_inited) { r->send_pkt.header.uuid_src = *(uint32_t *)pkt->payload; thread_sem_signal(r->dispatch_thread); r->state = rpc_connected; } else if (r->state == rpc_connected) { struct iovec buf; buf.iov_len = pkt->header.payload_len; buf.iov_base = pkt->payload; process_msg(r, &buf); //free(pkt->payload); thread_sem_signal(r->dispatch_thread); } }
void on_recv(int fd, void *arg) { struct iobuf *buf; char key[9]; snprintf(key, sizeof(key), "%08x", fd); struct rpc *r = (struct rpc *)dict_get(_rpcd->dict_fd2rpc, key, NULL); if (!r) { loge("dict_get failed: key=%s", key); return; } //logi("on_recv fd = %d dict_get: key=%s, r->fd=%d\n", fd, key, r->fd); buf = rpc_recv_buf(r); if (!buf) { //loge("peer connect closed\n"); rpc_connect_destroy(_rpcd, r); return; } process_msg(r, buf); r->fd = fd;//must be reset //dump_buffer(buf->addr, buf->len); //dump_packet(&r->packet); free(buf->addr); free(buf); }
void on_rpc_read(int fd, void *arg) { struct p2p *p2p = (struct p2p *)arg; struct rpc *r = p2p->rpc; struct iovec *buf = rpc_recv_buf(r); if (!buf) { logi("rpc_recv_buf failed!\n"); return; } process_msg(r, buf); }
void on_rpc_read(int fd, void *arg) { pthread_t tid; struct p2p *p2p = (struct p2p *)arg; struct rpc *r = p2p->rpc; char *peer_id; char localip[MAX_ADDR_STRING]; char reflectip[MAX_ADDR_STRING]; struct sockaddr_in si; struct iobuf *buf = rpc_recv_buf(r); if (!buf) { printf("rpc_recv_buf failed!\n"); return; } struct nat_info *nat = (struct nat_info *)buf->addr; printf("peer info\n"); printf("nat.uuid = %s\n", nat->uuid); skt_addr_ntop(localip, nat->local.ip); skt_addr_ntop(reflectip, nat->reflect.ip); printf("nat.type = %d, local.ip = %s, port = %d\n", nat->type, localip, nat->local.port); printf("reflect.ip = %s, port = %d\n", reflectip, nat->reflect.port); p2p->ps = ptcp_socket_by_fd(p2p->nat.fd); if (p2p->ps == NULL) { printf("error!\n"); return; } if (p2p->rpc_state == P2P_RPC_SYN_SENT) {//client sleep(1); _p2p_connect(p2p, reflectip, nat->reflect.port); return; } //server peer_id = nat->uuid; p2p_connect(p2p, peer_id); si.sin_family = AF_INET; si.sin_addr.s_addr = inet_addr(_local_ip); si.sin_port = htons(_local_port); printf("ptcp_bind %s:%d\n", _local_ip, _local_port); ptcp_bind(p2p->ps, (struct sockaddr*)&si, sizeof(si)); ptcp_listen(p2p->ps, 0); pthread_create(&tid, NULL, tmp_thread, p2p); }