#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <unistd.h>
#include <cstdio>
#include <cerrno>
#include <cstdlib>
#include <poll.h>
#include <vector>
#include <arpa/inet.h>
int main (int ac, char **av) {
if(ac != 2) {
fprintf(stderr, "Usage: %s portnumber\n", *av);
return 1;
}
struct addrinfo *res0;
struct addrinfo hints = { 0, 0, SOCK_DGRAM };
int rc = getaddrinfo(0, av[1], &hints, &res0);
if(rc) {
fprintf(stderr, "%s/%s: %s\n", av[1], av[2], gai_strerror(rc));
return 1;
}
char *name = res0->ai_canonname;
std::vector<pollfd> fds;
for(struct addrinfo *res = res0; res; res=res->ai_next) {
fprintf(stderr, "%s: ", name);
int fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
if(fd < 0) {
perror("socket");
continue;
}
rc = bind(fd, res->ai_addr, res->ai_addrlen);
if(rc < 0) {
perror("bind");
continue;
}
fprintf(stderr, "Bound (%d)\n", fd);
fds.push_back(pollfd({fd, POLLIN}));
}
freeaddrinfo(res0);
while( (rc = poll( &fds[0], fds.size(), -1)) > 0 ) {
for(size_t i = 0; i < fds.size(); ++i) {
pollfd& pfd = fds[i];
if(!pfd.revents)
continue;
pfd.revents = 0;
union {
sockaddr s;
sockaddr_in sin;
sockaddr_in6 sin6;
} u;
rc = recv(pfd.fd, &u, sizeof u, 0);
if(rc < 0) {
perror("recv");
continue;
}
fprintf(stderr, "Received %d bytes\n", rc);
char str[256];
switch(ntohs(u.s.sa_family)) {
case AF_INET:
if(inet_ntop(AF_INET, &u.sin.sin_addr, str, sizeof str)) {
fprintf(stderr, "AF_INET %s\n", str);
} else {
fprintf(stderr, "AF_INET unknown\n");
}
break;
case AF_INET6:
if(inet_ntop(AF_INET6, &u.sin6.sin6_addr, str, sizeof str)) {
fprintf(stderr, "AF_INET6 %s\n", str);
} else {
fprintf(stderr, "AF_INET6 unknown\n");
}
break;
default:
fprintf(stderr, "UNKNOWN\n");
break;
}
}
}
}
I2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojaW5jbHVkZSA8bmV0ZGIuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8Y3N0ZGlvPgojaW5jbHVkZSA8Y2Vycm5vPgojaW5jbHVkZSA8Y3N0ZGxpYj4KI2luY2x1ZGUgPHBvbGwuaD4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGFycGEvaW5ldC5oPgoKaW50IG1haW4gKGludCBhYywgY2hhciAqKmF2KSB7CgogIGlmKGFjICE9IDIpIHsKICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIHBvcnRudW1iZXJcbiIsICphdik7CiAgICByZXR1cm4gMTsKICB9CgogIHN0cnVjdCBhZGRyaW5mbyAqcmVzMDsKICBzdHJ1Y3QgYWRkcmluZm8gaGludHMgPSB7IDAsIDAsIFNPQ0tfREdSQU0gfTsKICBpbnQgcmMgPSBnZXRhZGRyaW5mbygwLCBhdlsxXSwgJmhpbnRzLCAmcmVzMCk7CiAgaWYocmMpIHsKICAgIGZwcmludGYoc3RkZXJyLCAiJXMvJXM6ICVzXG4iLCBhdlsxXSwgYXZbMl0sIGdhaV9zdHJlcnJvcihyYykpOwogICAgcmV0dXJuIDE7CiAgfQoKICBjaGFyICpuYW1lID0gcmVzMC0+YWlfY2Fub25uYW1lOwogIHN0ZDo6dmVjdG9yPHBvbGxmZD4gZmRzOwogIGZvcihzdHJ1Y3QgYWRkcmluZm8gKnJlcyA9IHJlczA7IHJlczsgcmVzPXJlcy0+YWlfbmV4dCkgewogICAgZnByaW50ZihzdGRlcnIsICIlczogIiwgbmFtZSk7CiAgICBpbnQgZmQgPSBzb2NrZXQocmVzLT5haV9mYW1pbHksIHJlcy0+YWlfc29ja3R5cGUsIHJlcy0+YWlfcHJvdG9jb2wpOwogICAgaWYoZmQgPCAwKSB7CiAgICAgIHBlcnJvcigic29ja2V0Iik7CiAgICAgIGNvbnRpbnVlOwogICAgfQoKICAgIHJjID0gYmluZChmZCwgcmVzLT5haV9hZGRyLCByZXMtPmFpX2FkZHJsZW4pOwogICAgaWYocmMgPCAwKSB7CiAgICAgIHBlcnJvcigiYmluZCIpOwogICAgICBjb250aW51ZTsKICAgIH0KICAgIGZwcmludGYoc3RkZXJyLCAiQm91bmQgKCVkKVxuIiwgZmQpOwogICAgZmRzLnB1c2hfYmFjayhwb2xsZmQoe2ZkLCBQT0xMSU59KSk7CiAgfQogIGZyZWVhZGRyaW5mbyhyZXMwKTsKCiAgd2hpbGUoIChyYyA9IHBvbGwoICZmZHNbMF0sIGZkcy5zaXplKCksIC0xKSkgPiAwICkgewogICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IGZkcy5zaXplKCk7ICsraSkgewogICAgICBwb2xsZmQmIHBmZCA9IGZkc1tpXTsKICAgICAgaWYoIXBmZC5yZXZlbnRzKQogICAgICAgIGNvbnRpbnVlOwogICAgICBwZmQucmV2ZW50cyA9IDA7CgogICAgICB1bmlvbiB7CiAgICAgICAgc29ja2FkZHIgczsKICAgICAgICBzb2NrYWRkcl9pbiBzaW47CiAgICAgICAgc29ja2FkZHJfaW42IHNpbjY7CiAgICAgIH0gdTsKICAgICAgcmMgPSByZWN2KHBmZC5mZCwgJnUsIHNpemVvZiB1LCAwKTsKICAgICAgaWYocmMgPCAwKSB7CiAgICAgICAgcGVycm9yKCJyZWN2Iik7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgZnByaW50ZihzdGRlcnIsICJSZWNlaXZlZCAlZCBieXRlc1xuIiwgcmMpOwoKICAgICAgY2hhciBzdHJbMjU2XTsKICAgICAgc3dpdGNoKG50b2hzKHUucy5zYV9mYW1pbHkpKSB7CiAgICAgIGNhc2UgQUZfSU5FVDoKICAgICAgICBpZihpbmV0X250b3AoQUZfSU5FVCwgJnUuc2luLnNpbl9hZGRyLCBzdHIsIHNpemVvZiBzdHIpKSB7CiAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkFGX0lORVQgJXNcbiIsIHN0cik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQUZfSU5FVCB1bmtub3duXG4iKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQUZfSU5FVDY6CiAgICAgICAgaWYoaW5ldF9udG9wKEFGX0lORVQ2LCAmdS5zaW42LnNpbjZfYWRkciwgc3RyLCBzaXplb2Ygc3RyKSkgewogICAgICAgICAgZnByaW50ZihzdGRlcnIsICJBRl9JTkVUNiAlc1xuIiwgc3RyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZnByaW50ZihzdGRlcnIsICJBRl9JTkVUNiB1bmtub3duXG4iKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJVTktOT1dOXG4iKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0KfQo=