2 #include <sys/socket.h>
5 #include <netinet/in.h>
16 usage(const char *cmd
)
18 fprintf(stderr
, "%s -4 ip4 -p port [-r]\n", cmd
);
23 main(int argc
, char *argv
[])
25 struct sockaddr_in in
, in2
;
26 int s
, opt
, n
, reuseport
;
29 memset(&in
, 0, sizeof(in
));
30 in
.sin_family
= AF_INET
;
34 while ((opt
= getopt(argc
, argv
, "4:p:r")) != -1) {
37 if (inet_pton(AF_INET
, optarg
, &in
.sin_addr
) <= 0)
42 in
.sin_port
= strtol(optarg
, NULL
, 10);
43 in
.sin_port
= htons(in
.sin_port
);
55 if (in
.sin_addr
.s_addr
== INADDR_ANY
|| in
.sin_port
== 0)
58 s
= socket(AF_INET
, SOCK_DGRAM
, 0);
60 err(2, "socket failed");
63 if (setsockopt(s
, SOL_SOCKET
, SO_REUSEPORT
,
64 &reuseport
, sizeof(reuseport
)) < 0)
65 err(2, "setsockopt SO_REUSEPORT failed");
68 if (connect(s
, (const struct sockaddr
*)&in
, sizeof(in
)) < 0)
69 err(2, "connect failed");
71 memset(&in2
, 0, sizeof(in2
));
72 in2
.sin_family
= AF_UNSPEC
;
73 if (connect(s
, (const struct sockaddr
*)&in2
, sizeof(in2
)) < 0) {
76 if (error
!= EAFNOSUPPORT
)
77 errc(2, error
, "di-connect failed");
80 n
= sendto(s
, buf
, sizeof(buf
), 0,
81 (const struct sockaddr
*)&in
, sizeof(in
));
83 err(2, "sendto failed");
84 else if (n
!= (int)sizeof(buf
))
85 errx(2, "sent truncated data %d", n
);
87 n
= read(s
, buf
, sizeof(buf
));
89 err(2, "read failed");
90 printf("read %d, done\n", n
);