#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <unistd.h>
#include <cstdio>
#include <cerrno>
#include <cstdlib>
int main (int ac, char **av) {
if(ac != 3) {
fprintf(stderr, "Usage: %s hostname portnumber\n", *av);
return 1;
}
struct addrinfo *res0;
struct addrinfo hints = { AI_CANONNAME, 0, SOCK_DGRAM };
int rc = getaddrinfo(av[1], av[2], &hints, &res0);
if(rc) {
fprintf(stderr, "%s/%s: %s\n", av[1], av[2], gai_strerror(rc));
return 1;
}
char *name = res0->ai_canonname;
for(struct addrinfo *res = res0; res; res=res->ai_next) {
fprintf(stderr, "%s: %04X/%04X/%04X ", name, res->ai_family, res->ai_socktype, res->ai_protocol);
int fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
if(fd < 0) {
perror("socket");
continue;
}
rc = connect(fd, res->ai_addr, res->ai_addrlen);
if(rc < 0) {
perror("connect");
continue;
}
fprintf(stderr, "Connected (%d)\n", fd);
*(unsigned short*)res->ai_addr = htons(*(unsigned short*)res->ai_addr);
rc = send(fd, res->ai_addr, res->ai_addrlen, 0);
*(unsigned short*)res->ai_addr = ntohs(*(unsigned short*)res->ai_addr);
if(rc < 0) {
perror("send");
}
close(fd);
}
freeaddrinfo(res0);
}
I2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojaW5jbHVkZSA8bmV0ZGIuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8Y3N0ZGlvPgojaW5jbHVkZSA8Y2Vycm5vPgojaW5jbHVkZSA8Y3N0ZGxpYj4KCmludCBtYWluIChpbnQgYWMsIGNoYXIgKiphdikgewoKICBpZihhYyAhPSAzKSB7CiAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBob3N0bmFtZSBwb3J0bnVtYmVyXG4iLCAqYXYpOwogICAgcmV0dXJuIDE7CiAgfQoKICBzdHJ1Y3QgYWRkcmluZm8gKnJlczA7CiAgc3RydWN0IGFkZHJpbmZvIGhpbnRzID0geyBBSV9DQU5PTk5BTUUsIDAsIFNPQ0tfREdSQU0gfTsKICBpbnQgcmMgPSBnZXRhZGRyaW5mbyhhdlsxXSwgYXZbMl0sICZoaW50cywgJnJlczApOwogIGlmKHJjKSB7CiAgICBmcHJpbnRmKHN0ZGVyciwgIiVzLyVzOiAlc1xuIiwgYXZbMV0sIGF2WzJdLCBnYWlfc3RyZXJyb3IocmMpKTsKICAgIHJldHVybiAxOwogIH0KCiAgY2hhciAqbmFtZSA9IHJlczAtPmFpX2Nhbm9ubmFtZTsKICBmb3Ioc3RydWN0IGFkZHJpbmZvICpyZXMgPSByZXMwOyByZXM7IHJlcz1yZXMtPmFpX25leHQpIHsKICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICUwNFgvJTA0WC8lMDRYICIsIG5hbWUsIHJlcy0+YWlfZmFtaWx5LCByZXMtPmFpX3NvY2t0eXBlLCByZXMtPmFpX3Byb3RvY29sKTsKICAgIGludCBmZCA9IHNvY2tldChyZXMtPmFpX2ZhbWlseSwgcmVzLT5haV9zb2NrdHlwZSwgcmVzLT5haV9wcm90b2NvbCk7CiAgICBpZihmZCA8IDApIHsKICAgICAgcGVycm9yKCJzb2NrZXQiKTsKICAgICAgY29udGludWU7CiAgICB9CgogICAgcmMgPSBjb25uZWN0KGZkLCByZXMtPmFpX2FkZHIsIHJlcy0+YWlfYWRkcmxlbik7CiAgICBpZihyYyA8IDApIHsKICAgICAgcGVycm9yKCJjb25uZWN0Iik7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgZnByaW50ZihzdGRlcnIsICJDb25uZWN0ZWQgKCVkKVxuIiwgZmQpOwogICAgKih1bnNpZ25lZCBzaG9ydCopcmVzLT5haV9hZGRyID0gaHRvbnMoKih1bnNpZ25lZCBzaG9ydCopcmVzLT5haV9hZGRyKTsKICAgIHJjID0gc2VuZChmZCwgcmVzLT5haV9hZGRyLCByZXMtPmFpX2FkZHJsZW4sIDApOwogICAgKih1bnNpZ25lZCBzaG9ydCopcmVzLT5haV9hZGRyID0gbnRvaHMoKih1bnNpZ25lZCBzaG9ydCopcmVzLT5haV9hZGRyKTsKICAgIGlmKHJjIDwgMCkgewogICAgICBwZXJyb3IoInNlbmQiKTsKICAgIH0KICAgIGNsb3NlKGZkKTsKICB9CiAgZnJlZWFkZHJpbmZvKHJlczApOwp9Cg==