18522435ba82b6174c8e7d5a0045b10ec0cb05e2
[cubemap] / udpstream.cpp
1 #include "log.h"
2 #include "markpool.h"
3 #include "udpstream.h"
4 #include "util.h"
5
6 UDPStream::UDPStream(const sockaddr_in6 &dst, MarkPool *mark_pool)
7         : dst(dst),
8           mark_pool(mark_pool),
9           fwmark(0)
10 {
11         sock = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
12         if (sock == -1) {
13                 // Oops. Ignore this output, then.
14                 log_perror("socket");
15                 return;
16         }
17
18         if (mark_pool != NULL) {
19                 fwmark = mark_pool->get_mark();
20                 if (setsockopt(sock, SOL_SOCKET, SO_MARK, &fwmark, sizeof(fwmark)) == -1) {                          
21                         if (fwmark != 0) {
22                                 log_perror("setsockopt(SO_MARK)");
23                         }
24                 }
25         }
26 }
27
28 UDPStream::~UDPStream()
29 {
30         if (sock != -1) {
31                 safe_close(sock);
32         }
33         if (mark_pool != NULL) {
34                 mark_pool->release_mark(fwmark);
35         }
36 }
37
38 void UDPStream::send(const char *data, size_t bytes)
39 {
40         if (sock == -1) {
41                 return;
42         }
43         ssize_t err = sendto(sock, data, bytes, 0, reinterpret_cast<sockaddr *>(&dst), sizeof(dst));
44         if (err == -1) {
45                 log_perror("sendto");
46         }
47 }