9 #include <sys/socket.h>
13 # define socklen_t int
19 localaddr(_local), remaddr(_rem)
22 setfd(socket(PF_INET, SOCK_RAW, ip_protocol));
24 || setsockopt(
getfd(), SOL_SOCKET, SO_REUSEADDR, &x,
sizeof(x)) < 0)
33 struct sockaddr *sa = _local.sockaddr();
34 if (bind(
getfd(), sa, _local.sockaddr_len()))
42 struct sockaddr_in nsa;
43 socklen_t nsalen =
sizeof(nsa);
44 if (getsockname(
getfd(), (sockaddr *)&nsa, &nsalen) < 0)
49 localaddr =
WvIPAddr((sockaddr*)&nsa);
53 struct sockaddr *sa = _rem.sockaddr();
54 if (connect(
getfd(), sa, _rem.sockaddr_len()))
65 WvIPRawStream::~WvIPRawStream()
76 const WvAddr *WvIPRawStream::local()
const
84 if (!
isok() || !buf || !count)
return 0;
86 struct sockaddr_in from;
87 socklen_t fromlen =
sizeof(from);
88 int in = recvfrom(
getfd(), buf, count, 0, (sockaddr *)&from, &fromlen);
91 remaddr =
WvIPAddr((sockaddr *)&from);
94 return in < 0 ? 0 : in;
100 if (!
isok() || !buf || !count)
return 0;
102 struct sockaddr *to = remaddr.sockaddr();
103 size_t tolen = remaddr.sockaddr_len();
106 out = sendto(
getfd(), buf, count, 0, to, tolen);
108 if (out < 0 && errno == EACCES)
117 return out < 0 ? 0 : out;
121 void WvIPRawStream::enable_broadcasts()
127 setsockopt(
getfd(), SOL_SOCKET, SO_BROADCAST, &value,
sizeof(value));