From 71b58e7724e94d045c0d128bb11960e56b9be33d Mon Sep 17 00:00:00 2001 From: Sukchan Lee Date: Fri, 1 Dec 2017 17:39:28 +0900 Subject: [PATCH] tcp/udp interface is changed --- lib/core/include/core_network.h | 15 ++---- lib/core/src/unix/tcp.c | 70 +++++++++++------------- lib/core/src/unix/udp.c | 96 +++++++++++++++------------------ lib/core/test/testsock.c | 83 ++++++++++++++++++++++------ 4 files changed, 145 insertions(+), 119 deletions(-) diff --git a/lib/core/include/core_network.h b/lib/core/include/core_network.h index 910fce3b5..377bd4cee 100644 --- a/lib/core/include/core_network.h +++ b/lib/core/include/core_network.h @@ -149,20 +149,15 @@ CORE_DECLARE(status_t) core_inet_pton(int family, const char *src, void *sa); * UDP Socket */ CORE_DECLARE(status_t) udp_socket(sock_id *new, int family); -CORE_DECLARE(status_t) udp_server(sock_id *new, - int family, const char *hostname, c_uint16_t port); -CORE_DECLARE(status_t) udp_client(sock_id *new, - int family, const char *hostname, c_uint16_t port); -CORE_DECLARE(status_t) udp_connect(sock_id id, - const char *hostname, c_uint16_t port); +CORE_DECLARE(status_t) udp_server(sock_id *new, c_sockaddr_t *addr); +CORE_DECLARE(status_t) udp_client(sock_id *new, c_sockaddr_t *addr); +CORE_DECLARE(status_t) udp_connect(sock_id id, c_sockaddr_t *addr); /* * TCP Socket */ -CORE_DECLARE(status_t) tcp_server(sock_id *new, - int family, const char *hostname, c_uint16_t port); -CORE_DECLARE(status_t) tcp_client(sock_id *new, - int family, const char *hostname, c_uint16_t port); +CORE_DECLARE(status_t) tcp_server(sock_id *new, c_sockaddr_t *addr); +CORE_DECLARE(status_t) tcp_client(sock_id *new, c_sockaddr_t *addr); /* * SCTP Socket diff --git a/lib/core/src/unix/tcp.c b/lib/core/src/unix/tcp.c index ef9a79509..71834e96d 100644 --- a/lib/core/src/unix/tcp.c +++ b/lib/core/src/unix/tcp.c @@ -3,96 +3,86 @@ #include "core_debug.h" #include "core_arch_network.h" -status_t tcp_server(sock_id *new, - int family, const char *hostname, c_uint16_t port) +status_t tcp_server(sock_id *new, c_sockaddr_t *addr) { status_t rv; - c_sockaddr_t *sa; - sock_t *sock = NULL; + c_sockaddr_t *iter; char buf[CORE_ADDRSTRLEN]; - rv = core_getaddrinfo(&sa, family, hostname, port, AI_PASSIVE); - d_assert(rv == CORE_OK && sa, return CORE_ERROR,); + d_assert(new, return CORE_ERROR,); + d_assert(addr, return CORE_ERROR,); - while(sa) + iter = addr; + while(iter) { - rv = sock_socket(new, sa->c_sa_family, SOCK_STREAM, IPPROTO_TCP); + rv = sock_socket(new, iter->c_sa_family, SOCK_STREAM, IPPROTO_TCP); if (rv != CORE_OK) continue; - sock = (sock_t *)*new; - d_assert(sock_setsockopt(*new, SOCK_O_REUSEADDR, 1) == CORE_OK, return CORE_ERROR, - "setsockopt(%s:%d) failed(%d:%s)", - CORE_ADDR(sa, buf), port, errno, strerror(errno)); + "setsockopt [%s]:%d failed(%d:%s)", + CORE_ADDR(iter, buf), CORE_PORT(iter), errno, strerror(errno)); - if (sock_bind(*new, sa) == CORE_OK) + if (sock_bind(*new, iter) == CORE_OK) { - d_trace(1, "tcp bind %s:%d\n", CORE_ADDR(sa, buf), port); + d_trace(1, "tcp_server() [%s]:%d\n", + CORE_ADDR(iter, buf), CORE_PORT(iter)); break; } rv = sock_delete(*new); d_assert(rv == CORE_OK, return CORE_ERROR,); - sa = sa->next; + iter = iter->next; } - if (sa == NULL) + if (iter == NULL) { - d_error("tcp bind(%d:%s:%d) failed(%d:%s)", - sock->family, hostname, port, errno, strerror(errno)); + d_error("tcp_server() [%s]:%d failed(%d:%s)", + CORE_ADDR(addr, buf), CORE_PORT(addr), errno, strerror(errno)); return CORE_ERROR; } - rv = core_freeaddrinfo(sa); - d_assert(rv == CORE_OK, return CORE_ERROR,); - rv = sock_listen(*new); d_assert(rv == CORE_OK, return CORE_ERROR,); return CORE_OK; } -status_t tcp_client(sock_id *new, - int family, const char *hostname, c_uint16_t port) +status_t tcp_client(sock_id *new, c_sockaddr_t *addr) { status_t rv; - c_sockaddr_t *sa; - sock_t *sock = NULL; + c_sockaddr_t *iter; char buf[CORE_ADDRSTRLEN]; - rv = core_getaddrinfo(&sa, family, hostname, port, 0); - d_assert(rv == CORE_OK && sa, return CORE_ERROR,); + d_assert(new, return CORE_ERROR,); + d_assert(addr, return CORE_ERROR,); - while(sa) + iter = addr; + while(iter) { - rv = sock_socket(new, sa->c_sa_family, SOCK_STREAM, IPPROTO_TCP); + rv = sock_socket(new, iter->c_sa_family, SOCK_STREAM, IPPROTO_TCP); if (rv != CORE_OK) continue; - sock = (sock_t *)*new; - - if (sock_connect(*new, sa) == CORE_OK) + if (sock_connect(*new, iter) == CORE_OK) { - d_trace(1, "tcp connect %s:%d\n", CORE_ADDR(sa, buf), port); + d_trace(1, "tcp_client() [%s]:%d\n", + CORE_ADDR(iter, buf), CORE_PORT(iter)); break; } rv = sock_delete(*new); d_assert(rv == CORE_OK, return CORE_ERROR,); - sa = sa->next; + iter = iter->next; } - if (sa == NULL) + if (iter == NULL) { - d_error("tcp connect(%d:%s:%d) failed(%d:%s)", - sock->family, hostname, port, errno, strerror(errno)); + d_error("tcp_client() [%s]:%d failed(%d:%s)", + CORE_ADDR(addr, buf), CORE_PORT(addr), errno, strerror(errno)); return CORE_ERROR; } - rv = core_freeaddrinfo(sa); - d_assert(rv == CORE_OK, return CORE_ERROR,); - return CORE_OK; } diff --git a/lib/core/src/unix/udp.c b/lib/core/src/unix/udp.c index 730c6852a..6e7f5ecb9 100644 --- a/lib/core/src/unix/udp.c +++ b/lib/core/src/unix/udp.c @@ -15,126 +15,114 @@ status_t udp_socket(sock_id *new, int family) return CORE_OK; } -status_t udp_server(sock_id *new, - int family, const char *hostname, c_uint16_t port) +status_t udp_server(sock_id *new, c_sockaddr_t *addr) { status_t rv; - c_sockaddr_t *sa; + c_sockaddr_t *iter; char buf[CORE_ADDRSTRLEN]; - rv = core_getaddrinfo(&sa, family, hostname, port, AI_PASSIVE); - d_assert(rv == CORE_OK && sa, return CORE_ERROR,); + d_assert(new, return CORE_ERROR,); + d_assert(addr, return CORE_ERROR,); - while(sa) + iter = addr; + while(iter) { - rv = udp_socket(new, sa->c_sa_family); + rv = udp_socket(new, iter->c_sa_family); if (rv != CORE_OK) continue; d_assert(sock_setsockopt(*new, SOCK_O_REUSEADDR, 1) == CORE_OK, return CORE_ERROR, - "setsockopt(%s:%d) failed(%d:%s)", - CORE_ADDR(sa, buf), port, errno, strerror(errno)); + "setsockopt [%s]:%d failed(%d:%s)", + CORE_ADDR(iter, buf), CORE_PORT(iter), errno, strerror(errno)); - if (sock_bind(*new, sa) == CORE_OK) + if (sock_bind(*new, iter) == CORE_OK) { - d_trace(1, "udp bind %s:%d\n", CORE_ADDR(sa, buf), port); + d_trace(1, "udp_server() [%s]:%d\n", + CORE_ADDR(iter, buf), CORE_PORT(iter)); break; } rv = sock_delete(*new); d_assert(rv == CORE_OK, return CORE_ERROR,); - sa = sa->next; + iter = iter->next; } - if (sa == NULL) + if (iter == NULL) { - d_error("udp bind(%d:%s:%d) failed(%d:%s)", - family, hostname, port, errno, strerror(errno)); + d_error("udpserver() [%s]:%d failed(%d:%s)", + CORE_ADDR(addr, buf), CORE_PORT(addr), errno, strerror(errno)); return CORE_ERROR; } - rv = core_freeaddrinfo(sa); - d_assert(rv == CORE_OK, return CORE_ERROR,); - return CORE_OK; } -status_t udp_client(sock_id *new, - int family, const char *hostname, c_uint16_t port) +status_t udp_client(sock_id *new, c_sockaddr_t *addr) { status_t rv; - c_sockaddr_t *sa; - sock_t *sock = NULL; + c_sockaddr_t *iter; char buf[CORE_ADDRSTRLEN]; - rv = core_getaddrinfo(&sa, family, hostname, port, 0); - d_assert(rv == CORE_OK && sa, return CORE_ERROR,); + d_assert(new, return CORE_ERROR,); + d_assert(addr, return CORE_ERROR,); - while(sa) + iter = addr; + while(iter) { - rv = udp_socket(new, sa->c_sa_family); + rv = udp_socket(new, iter->c_sa_family); if (rv != CORE_OK) continue; - sock = (sock_t *)*new; - - if (sock_connect(*new, sa) == CORE_OK) + if (sock_connect(*new, iter) == CORE_OK) { - d_trace(1, "udp connect %s:%d\n", CORE_ADDR(sa, buf), port); + d_trace(1, "udp_client() [%s]:%d\n", + CORE_ADDR(iter, buf), CORE_PORT(iter)); break; } rv = sock_delete(*new); d_assert(rv == CORE_OK, return CORE_ERROR,); - sa = sa->next; + iter = iter->next; } - if (sa == NULL) + if (iter == NULL) { - d_error("udp connect(%d:%s:%d) failed(%d:%s)", - sock->family, hostname, port, errno, strerror(errno)); + d_error("udp_client() [%s]:%d failed(%d:%s)", + CORE_ADDR(addr, buf), CORE_PORT(addr), errno, strerror(errno)); return CORE_ERROR; } - rv = core_freeaddrinfo(sa); - d_assert(rv == CORE_OK, return CORE_ERROR,); - return CORE_OK; } -status_t udp_connect(sock_id id, const char *hostname, c_uint16_t port) +status_t udp_connect(sock_id id, c_sockaddr_t *addr) { - status_t rv; - c_sockaddr_t *sa; - sock_t *sock = (sock_t *)id; + c_sockaddr_t *iter; char buf[CORE_ADDRSTRLEN]; d_assert(id, return CORE_ERROR,); + d_assert(addr, return CORE_ERROR,); - rv = core_getaddrinfo(&sa, sock->family, hostname, port, 0); - d_assert(rv == CORE_OK && sa, return CORE_ERROR,); - - while(sa) + iter = addr; + while(iter) { - if (sock_connect(id, sa) == CORE_OK) + if (sock_connect(id, iter) == CORE_OK) { - d_trace(1, "udp connect %s:%d\n", CORE_ADDR(sa, buf), port); + d_trace(1, "udp_connect() [%s]:%d\n", + CORE_ADDR(iter, buf), CORE_PORT(iter)); break; } - sa = sa->next; + iter = iter->next; } - if (sa == NULL) + if (iter == NULL) { - d_error("udp connect(%d:%s:%d) failed(%d:%s)", - sock->family, hostname, port, errno, strerror(errno)); + d_error("udp_connect() [%s]:%d failed(%d:%s)", + CORE_ADDR(addr, buf), CORE_PORT(addr), errno, strerror(errno)); return CORE_ERROR; } - rv = core_freeaddrinfo(sa); - d_assert(rv == CORE_OK, return CORE_ERROR,); - return CORE_OK; } diff --git a/lib/core/test/testsock.c b/lib/core/test/testsock.c index 3922df230..31c1abaa2 100644 --- a/lib/core/test/testsock.c +++ b/lib/core/test/testsock.c @@ -13,21 +13,34 @@ static void sock_test1(abts_case *tc, void *data) { sock_id udp; + c_sockaddr_t *addr; status_t rv; - rv = udp_server(&udp, AF_UNSPEC, NULL, PORT); + rv = core_getaddrinfo(&addr, AF_UNSPEC, NULL, PORT, AI_PASSIVE); + ABTS_INT_EQUAL(tc, CORE_OK, rv); + rv = udp_server(&udp, addr); + ABTS_INT_EQUAL(tc, CORE_OK, rv); + rv = core_freeaddrinfo(addr); ABTS_INT_EQUAL(tc, CORE_OK, rv); rv = sock_delete(udp); ABTS_INT_EQUAL(tc, CORE_OK, rv); - rv = udp_server(&udp, AF_UNSPEC, "127.0.0.1", PORT); + rv = core_getaddrinfo(&addr, AF_UNSPEC, "127.0.0.1", PORT, AI_PASSIVE); + ABTS_INT_EQUAL(tc, CORE_OK, rv); + rv = udp_server(&udp, addr); + ABTS_INT_EQUAL(tc, CORE_OK, rv); + rv = core_freeaddrinfo(addr); ABTS_INT_EQUAL(tc, CORE_OK, rv); rv = sock_delete(udp); ABTS_INT_EQUAL(tc, CORE_OK, rv); - rv = udp_server(&udp, AF_UNSPEC, "::1", PORT); + rv = core_getaddrinfo(&addr, AF_UNSPEC, "::1", PORT, AI_PASSIVE); + ABTS_INT_EQUAL(tc, CORE_OK, rv); + rv = udp_server(&udp, addr); + ABTS_INT_EQUAL(tc, CORE_OK, rv); + rv = core_freeaddrinfo(addr); ABTS_INT_EQUAL(tc, CORE_OK, rv); rv = sock_delete(udp); @@ -40,10 +53,15 @@ static void *THREAD_FUNC test2_main(thread_id id, void *data) abts_case *tc = data; status_t rv; sock_id tcp; + c_sockaddr_t *addr; char str[STRLEN]; ssize_t size; - rv = tcp_client(&tcp, AF_UNSPEC, "::1", PORT); + rv = core_getaddrinfo(&addr, AF_UNSPEC, "::1", PORT, AI_PASSIVE); + ABTS_INT_EQUAL(tc, CORE_OK, rv); + rv = tcp_client(&tcp, addr); + ABTS_INT_EQUAL(tc, CORE_OK, rv); + rv = core_freeaddrinfo(addr); ABTS_INT_EQUAL(tc, CORE_OK, rv); size = core_recv(tcp, str, STRLEN, 0); @@ -60,9 +78,14 @@ static void sock_test2(abts_case *tc, void *data) { status_t rv; sock_id tcp, tcp2; + c_sockaddr_t *addr; ssize_t size; - rv = tcp_server(&tcp, AF_INET6, NULL, PORT); + rv = core_getaddrinfo(&addr, AF_INET6, NULL, PORT, AI_PASSIVE); + ABTS_INT_EQUAL(tc, CORE_OK, rv); + rv = tcp_server(&tcp, addr); + ABTS_INT_EQUAL(tc, CORE_OK, rv); + rv = core_freeaddrinfo(addr); ABTS_INT_EQUAL(tc, CORE_OK, rv); rv = thread_create(&test2_thread, NULL, test2_main, tc); @@ -120,12 +143,16 @@ static void sock_test3(abts_case *tc, void *data) sock_id udp; status_t rv; ssize_t size; - c_sockaddr_t sa; + c_sockaddr_t sa, *addr; socklen_t addrlen; char str[STRLEN]; char buf[CORE_ADDRSTRLEN]; - rv = udp_server(&udp, AF_INET, NULL, PORT); + rv = core_getaddrinfo(&addr, AF_INET, NULL, PORT, AI_PASSIVE); + ABTS_INT_EQUAL(tc, CORE_OK, rv); + rv = udp_server(&udp, addr); + ABTS_INT_EQUAL(tc, CORE_OK, rv); + rv = core_freeaddrinfo(addr); ABTS_INT_EQUAL(tc, CORE_OK, rv); rv = thread_create(&test3_thread, NULL, test3_main, tc); @@ -148,10 +175,15 @@ static void *THREAD_FUNC test4_main(thread_id id, void *data) abts_case *tc = data; status_t rv; sock_id udp; + c_sockaddr_t *addr; char str[STRLEN]; ssize_t size; - rv = udp_client(&udp, AF_INET, NULL, PORT); + rv = core_getaddrinfo(&addr, AF_INET, NULL, PORT, 0); + ABTS_INT_EQUAL(tc, CORE_OK, rv); + rv = udp_client(&udp, addr); + ABTS_INT_EQUAL(tc, CORE_OK, rv); + rv = core_freeaddrinfo(addr); ABTS_INT_EQUAL(tc, CORE_OK, rv); size = core_send(udp, DATASTR, strlen(DATASTR), 0); @@ -172,12 +204,16 @@ static void sock_test4(abts_case *tc, void *data) sock_id udp; status_t rv; ssize_t size; - c_sockaddr_t sa; + c_sockaddr_t sa, *addr; socklen_t addrlen; char str[STRLEN]; char buf[CORE_ADDRSTRLEN]; - rv = udp_server(&udp, AF_INET, NULL, PORT); + rv = core_getaddrinfo(&addr, AF_INET, NULL, PORT, AI_PASSIVE); + ABTS_INT_EQUAL(tc, CORE_OK, rv); + rv = udp_server(&udp, addr); + ABTS_INT_EQUAL(tc, CORE_OK, rv); + rv = core_freeaddrinfo(addr); ABTS_INT_EQUAL(tc, CORE_OK, rv); rv = thread_create(&test4_thread, NULL, test4_main, tc); @@ -203,13 +239,22 @@ static void *THREAD_FUNC test5_main(thread_id id, void *data) abts_case *tc = data; status_t rv; sock_id udp; + c_sockaddr_t *addr; char str[STRLEN]; ssize_t size; - rv = udp_server(&udp, AF_INET6, NULL, PORT2); + rv = core_getaddrinfo(&addr, AF_INET6, NULL, PORT2, AI_PASSIVE); + ABTS_INT_EQUAL(tc, CORE_OK, rv); + rv = udp_server(&udp, addr); + ABTS_INT_EQUAL(tc, CORE_OK, rv); + rv = core_freeaddrinfo(addr); ABTS_INT_EQUAL(tc, CORE_OK, rv); - rv = udp_connect(udp, NULL, PORT); + rv = core_getaddrinfo(&addr, AF_INET6, NULL, PORT, 0); + ABTS_INT_EQUAL(tc, CORE_OK, rv); + rv = udp_connect(udp, addr); + ABTS_INT_EQUAL(tc, CORE_OK, rv); + rv = core_freeaddrinfo(addr); ABTS_INT_EQUAL(tc, CORE_OK, rv); size = core_send(udp, DATASTR, strlen(DATASTR), 0); @@ -230,15 +275,23 @@ static void sock_test5(abts_case *tc, void *data) sock_id udp; status_t rv; ssize_t size; - c_sockaddr_t sa; + c_sockaddr_t sa, *addr; socklen_t addrlen; char str[STRLEN]; char buf[CORE_ADDRSTRLEN]; - rv = udp_server(&udp, AF_INET6, NULL, PORT); + rv = core_getaddrinfo(&addr, AF_INET6, NULL, PORT, AI_PASSIVE); + ABTS_INT_EQUAL(tc, CORE_OK, rv); + rv = udp_server(&udp, addr); + ABTS_INT_EQUAL(tc, CORE_OK, rv); + rv = core_freeaddrinfo(addr); ABTS_INT_EQUAL(tc, CORE_OK, rv); - rv = udp_connect(udp, NULL, PORT2); + rv = core_getaddrinfo(&addr, AF_INET6, NULL, PORT2, 0); + ABTS_INT_EQUAL(tc, CORE_OK, rv); + rv = udp_connect(udp, addr); + ABTS_INT_EQUAL(tc, CORE_OK, rv); + rv = core_freeaddrinfo(addr); ABTS_INT_EQUAL(tc, CORE_OK, rv); rv = thread_create(&test5_thread, NULL, test5_main, tc);