#include #include #include #include #include #include #include #include #include int main(int argc, char ** argv) { struct sockaddr_in in; struct sockaddr out; socklen_t inlen, outlen; const char * address; int fd, rc; if (argc != 2) { fprintf(stderr, "Usage: %s address\n", argv[0]); return 1; } address = argv[1]; fd = socket(PF_INET, SOCK_STREAM, 0); if (fd == -1) { err(errno, "socket"); } inlen = sizeof(in); memset(&in, 0, inlen); in.sin_family = AF_INET; in.sin_port = 0; rc = inet_pton(AF_INET, address, &in.sin_addr); if (rc == -1) { err(errno, "inet_pton"); } else if (rc == 0) { fprintf(stderr, "inet_pton: cannot parse %s\n", argv[1]); return 1; } if (bind(fd, (const struct sockaddr *)&in, inlen)) { err(errno, "bind"); } outlen = sizeof(out); if (getsockname(fd, &out, &outlen)) { err(errno, "getsockname"); } printf("addr: %s\n", inet_ntoa(((const struct sockaddr_in *)&out)->sin_addr)); }