summaryrefslogtreecommitdiffstats
path: root/nserver/src/nsocket.c
diff options
context:
space:
mode:
authorrsiddharth <s@ricketyspace.net>2019-09-15 14:18:14 -0400
committerrsiddharth <s@ricketyspace.net>2020-04-17 20:56:34 -0400
commit5b2da93ad7f12da9810aec90101b6ade12d7a99e (patch)
treea9da12ca999be499ad599b2199da5023dce669b0 /nserver/src/nsocket.c
parent753116f2ff57192aba2c0ec70e81fe7fa21a1671 (diff)
nserver/src/nsocket.c: Update get_socket.
* nserver/src/nsocket.c (get_socket): Use SO_REUSEADDR to dodge 'address already in use' error. Put all socket related code in the loop.
Diffstat (limited to 'nserver/src/nsocket.c')
-rw-r--r--nserver/src/nsocket.c31
1 files changed, 20 insertions, 11 deletions
diff --git a/nserver/src/nsocket.c b/nserver/src/nsocket.c
index ca36382..f9c9361 100644
--- a/nserver/src/nsocket.c
+++ b/nserver/src/nsocket.c
@@ -9,6 +9,7 @@ int get_socket()
{
int sockfd = 0;
int rc = 0;
+ int y = 1;
struct addrinfo hints;
struct addrinfo *servinfo = NULL;
@@ -23,22 +24,30 @@ int get_socket()
check(rc == 0, "get_socket: getaddrinfo failed");
// Loop through the addresses and find one that works.
- sockfd = 0;
- addr = servinfo;
- do {
+ for (addr = servinfo; addr != NULL; sockfd = 0,
+ addr = addr->ai_next) {
sockfd = socket(addr->ai_family, addr->ai_socktype,
addr->ai_protocol);
- if (sockfd > 0) {
- break;
+ if (sockfd < 1) {
+ continue;
}
- addr = addr->ai_next;
- } while(addr);
- check(sockfd > 0, "unable to get socket");
+ // dodge the "address already in use" error.
+ rc = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR,
+ &y, sizeof(int));
+ if (rc != 0) {
+ continue;
+ }
- // assign name to socket.
- rc = bind(sockfd, addr->ai_addr, addr->ai_addrlen);
- check(rc == 0, "get_socket: bind failed");
+ // assign name to socket.
+ rc = bind(sockfd, addr->ai_addr, addr->ai_addrlen);
+ if (rc != 0) {
+ continue;
+ }
+
+ break;
+ }
+ check(sockfd > 0, "unable to get socket");
// Cleanup.
freeaddrinfo(servinfo);