diff options
author | Toni Uhlig <matzeton@googlemail.com> | 2018-04-16 17:25:09 +0200 |
---|---|---|
committer | Toni Uhlig <matzeton@googlemail.com> | 2018-04-16 17:25:09 +0200 |
commit | c9b3ea785346546948afcf685c80c460f3b1317a (patch) | |
tree | e5e43c24167f8e0a4d66e776ea71219e6e3d4adc /src/socket.c | |
parent | 914f8f335d73c4dd69b72f6f2d8c53257bce497d (diff) |
POTD skeleton #10.
Signed-off-by: Toni Uhlig <matzeton@googlemail.com>
Diffstat (limited to 'src/socket.c')
-rw-r--r-- | src/socket.c | 59 |
1 files changed, 51 insertions, 8 deletions
diff --git a/src/socket.c b/src/socket.c index b666eb1..7b16254 100644 --- a/src/socket.c +++ b/src/socket.c @@ -23,19 +23,19 @@ static int socket_nonblock(const psocket *psock) return 0; } -int socket_init_in(const char *listen_addr, - const char *listen_port, struct addrinfo **results) +int socket_init_in(const char *addr, + const char *port, struct addrinfo **results) { struct addrinfo hints; - assert(listen_addr || listen_port); /* getaddrinfo wants either node or service */ + assert(addr || port); /* getaddrinfo wants either node or service */ memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; /* IPV4 && IPV6 */ hints.ai_socktype = SOCK_STREAM; /* TCP */ hints.ai_flags = AI_PASSIVE; /* all interfaces */ - return getaddrinfo(listen_addr, listen_port, &hints, results); + return getaddrinfo(addr, port, &hints, results); } int socket_bind_in(psocket *psock, struct addrinfo *results) @@ -58,11 +58,13 @@ int socket_bind_in(psocket *psock, struct addrinfo *results) if (!rp) return -1; - if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &reuse_enable, sizeof(int)) < 0) - return -2; + setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &reuse_enable, sizeof(int)); psock->fd = fd; psock->addr_len = rp->ai_addrlen; psock->addr = *rp->ai_addr; + psock->family = rp->ai_family; + psock->socktype = rp->ai_socktype; + psock->protocol = rp->ai_protocol; freeaddrinfo(results); return socket_nonblock(psock); } @@ -112,12 +114,15 @@ int socket_connect_in(psocket *psock, struct addrinfo *results) if (!rp) return -1; - if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &reuse_enable, sizeof(int)) < 0) - return -2; + setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &reuse_enable, sizeof(int)); psock->fd = fd; psock->addr_len = rp->ai_addrlen; psock->addr = *rp->ai_addr; + psock->family = rp->ai_family; + psock->socktype = rp->ai_socktype; + psock->protocol = rp->ai_protocol; freeaddrinfo(results); + return socket_nonblock(psock); } @@ -132,5 +137,43 @@ int socket_addrtostr_in(const psocket *psock, &hbuf[0], NI_MAXHOST, &sbuf[0], NI_MAXSERV, NI_NUMERICHOST | NI_NUMERICSERV); + return s; } + +int socket_reconnect_in(psocket *psock) +{ + int rv; + int reuse_enable = 1; + + assert(psock); + if (psock->fd >= 0) + return -1; + + psock->fd = socket(psock->family, psock->socktype, psock->protocol); + if (psock->fd < 0) + return -2; + rv = connect(psock->fd, &psock->addr, psock->addr_len); + if (!rv) { + socket_close(psock); + return -3; + } + + if (setsockopt(psock->fd, SOL_SOCKET, SO_REUSEADDR, &reuse_enable, sizeof(int)) < 0) { + socket_close(psock); + return -4; + } + + return 0; +} + +int socket_close(psocket *psock) +{ + int rv; + + assert(psock); + rv = close(psock->fd); + psock->fd = -1; + + return rv; +} |