diff --git a/include/neuron/connection/neu_connection.h b/include/neuron/connection/neu_connection.h index aed4ca44..8f50f835 100644 --- a/include/neuron/connection/neu_connection.h +++ b/include/neuron/connection/neu_connection.h @@ -303,4 +303,6 @@ int neu_conn_tcp_server_wait_msg(neu_conn_t *conn, int fd, void *context, int is_ipv4(const char *ip); int is_ipv6(const char *ip); +uint16_t neu_conn_udp_act_port(neu_conn_t *conn); + #endif diff --git a/src/connection/connection.c b/src/connection/connection.c index e757d6c8..a5af20a2 100644 --- a/src/connection/connection.c +++ b/src/connection/connection.c @@ -69,6 +69,8 @@ struct neu_conn { uint8_t *buf; uint16_t buf_size; uint16_t offset; + + uint16_t udp_act_port; }; static void conn_tcp_server_add_client(neu_conn_t *conn, int fd, @@ -951,6 +953,13 @@ static void conn_connect(neu_conn_t *conn) return; } + struct sockaddr_in local_addr = { 0 }; + socklen_t local_addr_len = sizeof(local_addr); + if (getsockname(fd, (struct sockaddr *) &local_addr, &local_addr_len) == + 0) { + conn->udp_act_port = ntohs(local_addr.sin_port); + } + if (is_ipv4(conn->param.params.udp.dst_ip)) { struct sockaddr_in remote = { .sin_family = AF_INET, @@ -1460,4 +1469,9 @@ int is_ipv6(const char *ip) { struct sockaddr_in6 sa; return inet_pton(AF_INET6, ip, &(sa.sin6_addr)) != 0; +} + +uint16_t neu_conn_udp_act_port(neu_conn_t *conn) +{ + return conn->udp_act_port; } \ No newline at end of file