]> git.tdb.fi Git - libs/net.git/blob - source/datagramsocket.cpp
Style update: spaces around assignments
[libs/net.git] / source / datagramsocket.cpp
1 #include <errno.h>
2 #include <msp/strings/formatter.h>
3 #include "datagramsocket.h"
4
5 namespace Msp {
6 namespace Net {
7
8 DatagramSocket::DatagramSocket(Family f, int p):
9         Socket(f, SOCK_DGRAM, p)
10 {
11 #ifdef WIN32
12         WSAEventSelect(handle, event, FD_READ|FD_CLOSE);
13 #endif
14         set_events(IO::P_INPUT);
15 }
16
17 int DatagramSocket::connect(const SockAddr &addr)
18 {
19         check_state(false);
20
21         sockaddr_storage sa;
22         socklen_t size = addr.fill_sockaddr(sa);
23
24         int err = ::connect(handle, reinterpret_cast<sockaddr *>(&sa), size);
25         if(err==-1)
26                 throw SystemError("Unable to connect", errno);
27
28         delete peer_addr;
29         peer_addr = addr.copy();
30
31         delete local_addr;
32         size = sizeof(sockaddr_storage);
33         getsockname(handle, reinterpret_cast<sockaddr *>(&sa), &size);
34         local_addr = SockAddr::create(sa);
35
36         connected = true;
37
38         return (err==0)?0:1;
39 }
40
41 unsigned DatagramSocket::sendto(const char *buf, unsigned size, const SockAddr &addr_)
42 {
43         check_state(false);
44
45         if(size==0)
46                 return 0;
47
48         sockaddr_storage addr;
49         socklen_t addr_len = addr_.fill_sockaddr(addr);
50
51         int ret = ::sendto(handle, buf, size, 0, reinterpret_cast<sockaddr *>(&addr), addr_len);
52         if(ret<0)
53         {
54                 if(errno==EAGAIN)
55                         return 0;
56                 else
57                         throw SystemError("Sendto failed", errno);
58         }
59
60         return ret;
61 }
62
63 unsigned DatagramSocket::recvfrom(char *buf, unsigned size, SockAddr *&addr_)
64 {
65         check_state(false);
66
67         if(size==0)
68                 return 0;
69
70         sockaddr_storage addr;
71         socklen_t addr_len = sizeof(sockaddr_storage);
72
73         int ret = ::recvfrom(handle, buf, size, 0, reinterpret_cast<sockaddr *>(&addr), &addr_len);
74         if(ret<0)
75         {
76                 if(errno==EAGAIN)
77                         return 0;
78                 else
79                         throw SystemError("Recvfrom failed", errno);
80         }
81
82         addr_ = SockAddr::create(addr);
83
84         return ret;
85 }
86
87 } // namespace Net
88 } // namespace Msp