tcp/udp interface is changed

This commit is contained in:
Sukchan Lee 2017-12-01 17:39:28 +09:00
parent d874ec5b48
commit 71b58e7724
4 changed files with 145 additions and 119 deletions

View File

@ -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

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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);