|
|
@ -26,8 +26,12 @@ |
|
|
|
#include <stdlib.h> |
|
|
|
#include <string.h> |
|
|
|
|
|
|
|
static const int server_port = TEST_PORT; |
|
|
|
/* Will be updated right after making the uv_connect_call */ |
|
|
|
static int connect_port = -1; |
|
|
|
|
|
|
|
static int getsocknamecount = 0; |
|
|
|
static int getpeernamecount = 0; |
|
|
|
|
|
|
|
static uv_loop_t* loop; |
|
|
|
static uv_tcp_t tcp; |
|
|
@ -72,9 +76,35 @@ static void after_read(uv_stream_t* handle, ssize_t nread, uv_buf_t buf) { |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void check_sockname(struct sockaddr* addr, const char* compare_ip, |
|
|
|
int compare_port, const char* context) { |
|
|
|
struct sockaddr_in check_addr = *(struct sockaddr_in*) addr; |
|
|
|
struct sockaddr_in compare_addr = uv_ip4_addr(compare_ip, compare_port); |
|
|
|
char check_ip[17]; |
|
|
|
int r; |
|
|
|
|
|
|
|
/* Both adresses should be ipv4 */ |
|
|
|
ASSERT(check_addr.sin_family == AF_INET); |
|
|
|
ASSERT(compare_addr.sin_family == AF_INET); |
|
|
|
|
|
|
|
/* Check if the ip matches */ |
|
|
|
ASSERT(memcmp(&check_addr.sin_addr, |
|
|
|
&compare_addr.sin_addr, |
|
|
|
sizeof compare_addr.sin_addr) == 0); |
|
|
|
|
|
|
|
/* Check if the port matches. If port == 0 anything goes. */ |
|
|
|
ASSERT(compare_port == 0 || check_addr.sin_port == compare_addr.sin_port); |
|
|
|
|
|
|
|
r = uv_ip4_name(&check_addr, (char*) check_ip, sizeof check_ip); |
|
|
|
ASSERT(r == 0); |
|
|
|
|
|
|
|
printf("%s: %s:%d\n", context, check_ip, ntohs(check_addr.sin_port)); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void on_connection(uv_stream_t* server, int status) { |
|
|
|
struct sockaddr sockname; |
|
|
|
int namelen = sizeof(sockname); |
|
|
|
struct sockaddr sockname, peername; |
|
|
|
int namelen; |
|
|
|
uv_handle_t* handle; |
|
|
|
int r; |
|
|
|
|
|
|
@ -95,45 +125,49 @@ static void on_connection(uv_stream_t* server, int status) { |
|
|
|
r = uv_accept(server, (uv_stream_t*)handle); |
|
|
|
ASSERT(r == 0); |
|
|
|
|
|
|
|
status = uv_getsockname(handle, &sockname, &namelen); |
|
|
|
if (status != 0) { |
|
|
|
fprintf(stderr, "uv_getsockname error (accepted) %d\n", |
|
|
|
uv_last_error(loop).code); |
|
|
|
} |
|
|
|
ASSERT(status == 0); |
|
|
|
|
|
|
|
namelen = sizeof sockname; |
|
|
|
r = uv_tcp_getsockname((uv_tcp_t*) handle, &sockname, &namelen); |
|
|
|
ASSERT(r == 0); |
|
|
|
check_sockname(&sockname, "127.0.0.1", server_port, "accepted socket"); |
|
|
|
getsocknamecount++; |
|
|
|
|
|
|
|
namelen = sizeof peername; |
|
|
|
r = uv_tcp_getpeername((uv_tcp_t*) handle, &peername, &namelen); |
|
|
|
ASSERT(r == 0); |
|
|
|
check_sockname(&peername, "127.0.0.1", connect_port, "accepted socket peer"); |
|
|
|
getpeernamecount++; |
|
|
|
|
|
|
|
r = uv_read_start((uv_stream_t*)handle, alloc, after_read); |
|
|
|
ASSERT(r == 0); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void on_connect(uv_connect_t* req, int status) { |
|
|
|
struct sockaddr sockname; |
|
|
|
int namelen = sizeof(sockname); |
|
|
|
int r; |
|
|
|
struct sockaddr sockname, peername; |
|
|
|
int r, namelen; |
|
|
|
|
|
|
|
ASSERT(status == 0); |
|
|
|
|
|
|
|
r = uv_getsockname((uv_handle_t*)&tcp, &sockname, &namelen); |
|
|
|
if (r != 0) { |
|
|
|
fprintf(stderr, "uv_getsockname error (connector) %d\n", |
|
|
|
uv_last_error(loop).code); |
|
|
|
} |
|
|
|
namelen = sizeof sockname; |
|
|
|
r = uv_tcp_getsockname((uv_tcp_t*) req->handle, &sockname, &namelen); |
|
|
|
ASSERT(r == 0); |
|
|
|
|
|
|
|
check_sockname(&sockname, "127.0.0.1", 0, "connected socket"); |
|
|
|
getsocknamecount++; |
|
|
|
|
|
|
|
namelen = sizeof peername; |
|
|
|
r = uv_tcp_getpeername((uv_tcp_t*) req->handle, &peername, &namelen); |
|
|
|
ASSERT(r == 0); |
|
|
|
check_sockname(&peername, "127.0.0.1", server_port, "connected socket peer"); |
|
|
|
getpeernamecount++; |
|
|
|
|
|
|
|
uv_close((uv_handle_t*)&tcp, NULL); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static int tcp_listener(int port) { |
|
|
|
struct sockaddr_in addr = uv_ip4_addr("0.0.0.0", port); |
|
|
|
struct sockaddr sockname; |
|
|
|
int namelen = sizeof(sockname); |
|
|
|
char ip[20]; |
|
|
|
static int tcp_listener() { |
|
|
|
struct sockaddr_in addr = uv_ip4_addr("0.0.0.0", server_port); |
|
|
|
struct sockaddr sockname, peername; |
|
|
|
int namelen; |
|
|
|
int r; |
|
|
|
|
|
|
|
r = uv_tcp_init(loop, &tcpServer); |
|
|
@ -155,30 +189,26 @@ static int tcp_listener(int port) { |
|
|
|
} |
|
|
|
|
|
|
|
memset(&sockname, -1, sizeof sockname); |
|
|
|
|
|
|
|
r = uv_getsockname((uv_handle_t*)&tcpServer, &sockname, &namelen); |
|
|
|
if (r != 0) { |
|
|
|
fprintf(stderr, "uv_getsockname error (listening) %d\n", |
|
|
|
uv_last_error(loop).code); |
|
|
|
} |
|
|
|
namelen = sizeof sockname; |
|
|
|
r = uv_tcp_getsockname(&tcpServer, &sockname, &namelen); |
|
|
|
ASSERT(r == 0); |
|
|
|
|
|
|
|
r = uv_ip4_name((struct sockaddr_in*)&sockname, ip, 20); |
|
|
|
ASSERT(r == 0); |
|
|
|
ASSERT(ip[0] == '0'); |
|
|
|
ASSERT(ip[1] == '.'); |
|
|
|
ASSERT(ip[2] == '0'); |
|
|
|
printf("sockname = %s\n", ip); |
|
|
|
|
|
|
|
check_sockname(&sockname, "0.0.0.0", server_port, "server socket"); |
|
|
|
getsocknamecount++; |
|
|
|
|
|
|
|
namelen = sizeof sockname; |
|
|
|
r = uv_tcp_getpeername(&tcpServer, &peername, &namelen); |
|
|
|
ASSERT(r == -1); |
|
|
|
ASSERT(uv_last_error(loop).code == UV_ENOTCONN); |
|
|
|
getpeernamecount++; |
|
|
|
|
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void tcp_connector() { |
|
|
|
int r; |
|
|
|
struct sockaddr_in server_addr = uv_ip4_addr("127.0.0.1", TEST_PORT); |
|
|
|
struct sockaddr_in server_addr = uv_ip4_addr("127.0.0.1", server_port); |
|
|
|
struct sockaddr sockname; |
|
|
|
int r, namelen; |
|
|
|
|
|
|
|
r = uv_tcp_init(loop, &tcp); |
|
|
|
tcp.data = &connect_req; |
|
|
@ -186,6 +216,14 @@ static void tcp_connector() { |
|
|
|
|
|
|
|
r = uv_tcp_connect(&connect_req, &tcp, server_addr, on_connect); |
|
|
|
ASSERT(!r); |
|
|
|
|
|
|
|
/* Fetch the actual port used by the connecting socket. */ |
|
|
|
namelen = sizeof sockname; |
|
|
|
r = uv_tcp_getsockname(&tcp, &sockname, &namelen); |
|
|
|
ASSERT(!r); |
|
|
|
ASSERT(sockname.sa_family == AF_INET); |
|
|
|
connect_port = ntohs(((struct sockaddr_in*) &sockname)->sin_port); |
|
|
|
ASSERT(connect_port > 0); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -195,7 +233,6 @@ static void udp_recv(uv_udp_t* handle, |
|
|
|
struct sockaddr* addr, |
|
|
|
unsigned flags) { |
|
|
|
struct sockaddr sockname; |
|
|
|
char ip[20]; |
|
|
|
int namelen; |
|
|
|
int r; |
|
|
|
|
|
|
@ -206,17 +243,11 @@ static void udp_recv(uv_udp_t* handle, |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
memset(&sockname, -1, sizeof sockname); |
|
|
|
namelen = sizeof(sockname); |
|
|
|
r = uv_getsockname((uv_handle_t*)&udp, &sockname, &namelen); |
|
|
|
if (r != 0) { |
|
|
|
fprintf(stderr, "uv_getsockname error (connector) %d\n", uv_last_error(loop).code); |
|
|
|
} |
|
|
|
r = uv_udp_getsockname(&udp, &sockname, &namelen); |
|
|
|
ASSERT(r == 0); |
|
|
|
|
|
|
|
r = uv_ip4_name((struct sockaddr_in*)&sockname, ip, 20); |
|
|
|
ASSERT(r == 0); |
|
|
|
printf("sockname = %s\n", ip); |
|
|
|
|
|
|
|
check_sockname(&sockname, "0.0.0.0", 0, "udp receiving socket"); |
|
|
|
getsocknamecount++; |
|
|
|
|
|
|
|
uv_close((uv_handle_t*) &udp, NULL); |
|
|
@ -229,11 +260,10 @@ static void udp_send(uv_udp_send_t* req, int status) { |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static int udp_listener(int port) { |
|
|
|
struct sockaddr_in addr = uv_ip4_addr("0.0.0.0", port); |
|
|
|
static int udp_listener() { |
|
|
|
struct sockaddr_in addr = uv_ip4_addr("0.0.0.0", server_port); |
|
|
|
struct sockaddr sockname; |
|
|
|
int namelen = sizeof(sockname); |
|
|
|
char ip[20]; |
|
|
|
int namelen; |
|
|
|
int r; |
|
|
|
|
|
|
|
r = uv_udp_init(loop, &udpServer); |
|
|
@ -249,20 +279,10 @@ static int udp_listener(int port) { |
|
|
|
} |
|
|
|
|
|
|
|
memset(&sockname, -1, sizeof sockname); |
|
|
|
|
|
|
|
r = uv_getsockname((uv_handle_t*)&udpServer, &sockname, &namelen); |
|
|
|
if (r != 0) { |
|
|
|
fprintf(stderr, "uv_getsockname error (listening) %d\n", uv_last_error(loop).code); |
|
|
|
} |
|
|
|
namelen = sizeof sockname; |
|
|
|
r = uv_udp_getsockname(&udpServer, &sockname, &namelen); |
|
|
|
ASSERT(r == 0); |
|
|
|
|
|
|
|
r = uv_ip4_name((struct sockaddr_in*)&sockname, ip, 20); |
|
|
|
ASSERT(r == 0); |
|
|
|
ASSERT(ip[0] == '0'); |
|
|
|
ASSERT(ip[1] == '.'); |
|
|
|
ASSERT(ip[2] == '0'); |
|
|
|
printf("sockname = %s\n", ip); |
|
|
|
|
|
|
|
check_sockname(&sockname, "0.0.0.0", server_port, "udp listener socket"); |
|
|
|
getsocknamecount++; |
|
|
|
|
|
|
|
r = uv_udp_recv_start(&udpServer, alloc, udp_recv); |
|
|
@ -281,7 +301,7 @@ static void udp_sender(void) { |
|
|
|
ASSERT(!r); |
|
|
|
|
|
|
|
buf = uv_buf_init("PING", 4); |
|
|
|
server_addr = uv_ip4_addr("127.0.0.1", TEST_PORT); |
|
|
|
server_addr = uv_ip4_addr("127.0.0.1", server_port); |
|
|
|
|
|
|
|
r = uv_udp_send(&send_req, &udp, &buf, 1, server_addr, udp_send); |
|
|
|
ASSERT(!r); |
|
|
@ -292,7 +312,7 @@ TEST_IMPL(getsockname_tcp) { |
|
|
|
uv_init(); |
|
|
|
loop = uv_default_loop(); |
|
|
|
|
|
|
|
if (tcp_listener(TEST_PORT)) |
|
|
|
if (tcp_listener()) |
|
|
|
return 1; |
|
|
|
|
|
|
|
tcp_connector(); |
|
|
@ -300,6 +320,7 @@ TEST_IMPL(getsockname_tcp) { |
|
|
|
uv_run(loop); |
|
|
|
|
|
|
|
ASSERT(getsocknamecount == 3); |
|
|
|
ASSERT(getpeernamecount == 3); |
|
|
|
|
|
|
|
return 0; |
|
|
|
} |
|
|
@ -309,7 +330,7 @@ TEST_IMPL(getsockname_udp) { |
|
|
|
uv_init(); |
|
|
|
loop = uv_default_loop(); |
|
|
|
|
|
|
|
if (udp_listener(TEST_PORT)) |
|
|
|
if (udp_listener()) |
|
|
|
return 1; |
|
|
|
|
|
|
|
udp_sender(); |
|
|
|