|
7 | 7 | #include <unistd.h>
|
8 | 8 | #include <arpa/inet.h>
|
9 | 9 | #include <sys/socket.h>
|
| 10 | +#include <netdb.h> |
10 | 11 |
|
11 | 12 | #include "../../net/lib/ksft.h"
|
12 | 13 |
|
13 | 14 | int main(int argc, char *argv[])
|
14 | 15 | {
|
15 |
| - struct sockaddr_in address; |
| 16 | + struct sockaddr_storage address; |
| 17 | + struct addrinfo *result; |
| 18 | + struct addrinfo hints; |
16 | 19 | unsigned int napi_id;
|
17 |
| - unsigned int port; |
| 20 | + socklen_t addr_len; |
18 | 21 | socklen_t optlen;
|
19 | 22 | char buf[1024];
|
20 | 23 | int opt = 1;
|
| 24 | + int family; |
21 | 25 | int server;
|
22 | 26 | int client;
|
23 | 27 | int ret;
|
24 | 28 |
|
25 |
| - server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); |
| 29 | + memset(&hints, 0, sizeof(hints)); |
| 30 | + hints.ai_family = AF_UNSPEC; |
| 31 | + hints.ai_socktype = SOCK_STREAM; |
| 32 | + hints.ai_flags = AI_PASSIVE; |
| 33 | + |
| 34 | + ret = getaddrinfo(argv[1], argv[2], &hints, &result); |
| 35 | + if (ret != 0) { |
| 36 | + fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(ret)); |
| 37 | + return 1; |
| 38 | + } |
| 39 | + |
| 40 | + family = result->ai_family; |
| 41 | + addr_len = result->ai_addrlen; |
| 42 | + |
| 43 | + server = socket(family, SOCK_STREAM, IPPROTO_TCP); |
26 | 44 | if (server < 0) {
|
27 | 45 | perror("socket creation failed");
|
| 46 | + freeaddrinfo(result); |
28 | 47 | if (errno == EAFNOSUPPORT)
|
29 | 48 | return -1;
|
30 | 49 | return 1;
|
31 | 50 | }
|
32 | 51 |
|
33 |
| - port = atoi(argv[2]); |
34 |
| - |
35 | 52 | if (setsockopt(server, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) {
|
36 | 53 | perror("setsockopt");
|
| 54 | + freeaddrinfo(result); |
37 | 55 | return 1;
|
38 | 56 | }
|
39 | 57 |
|
40 |
| - address.sin_family = AF_INET; |
41 |
| - inet_pton(AF_INET, argv[1], &address.sin_addr); |
42 |
| - address.sin_port = htons(port); |
| 58 | + memcpy(&address, result->ai_addr, result->ai_addrlen); |
| 59 | + freeaddrinfo(result); |
43 | 60 |
|
44 |
| - if (bind(server, (struct sockaddr *)&address, sizeof(address)) < 0) { |
| 61 | + if (bind(server, (struct sockaddr *)&address, addr_len) < 0) { |
45 | 62 | perror("bind failed");
|
46 | 63 | return 1;
|
47 | 64 | }
|
|
0 commit comments