Skip to content

Instantly share code, notes, and snippets.

@aragaer
Created September 20, 2018 17:23
Show Gist options
  • Save aragaer/c63746486da6be0b13de808bf1f65227 to your computer and use it in GitHub Desktop.
Save aragaer/c63746486da6be0b13de808bf1f65227 to your computer and use it in GitHub Desktop.
setsockopt REUSEPORT
#include <netinet/ip.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
int main() {
int res;
int value = 1;
int fd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr = {AF_INET, 0, INADDR_ANY};
res = setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &value, sizeof(value)); // Without this setsockopt
if (res == -1) {
perror("setsockopt1");
exit(-1);
}
res = bind(fd, (struct sockaddr *) &addr, sizeof(addr));
if (res == -1) {
perror("bind1");
exit(-1);
}
socklen_t addrlen = sizeof(addr);
res = getsockname(fd, (struct sockaddr *) &addr, &addrlen);
if (res == -1) {
perror("getsockname");
exit(-1);
}
in_port_t port = addr.sin_port;
listen(fd, 0);
int fd2 = socket(AF_INET, SOCK_STREAM, 0);
res = connect(fd2, (struct sockaddr *) &addr, sizeof(addr));
if (res == -1) {
perror("connect");
exit(-1);
}
int cl = accept(fd, NULL, NULL);
if (cl == -1) {
perror("accept");
exit(-1);
}
close(fd);
fd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr2 = {AF_INET, port, INADDR_ANY};
res = setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &value, sizeof(value));
if (res == -1) {
perror("setsockopt2");
exit(-1);
}
res = bind(fd, (struct sockaddr *) &addr2, sizeof(addr2)); // This bind would fail
if (res == -1) {
perror("bind2");
exit(-1);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment