]> git.tdb.fi Git - libs/net.git/blob - source/net/datagramsocket.cpp
Move most platform-specific code into overlay directories
[libs/net.git] / source / net / datagramsocket.cpp
1 #include "platform_api.h"
2 #include <msp/core/systemerror.h>
3 #include <msp/io/handle_private.h>
4 #include <msp/strings/format.h>
5 #include "datagramsocket.h"
6 #include "sockaddr_private.h"
7 #include "socket_private.h"
8
9 namespace Msp {
10 namespace Net {
11
12 DatagramSocket::DatagramSocket(Family f, int p):
13         ClientSocket(f, SOCK_DGRAM, p)
14 {
15         set_socket_events(S_INPUT);
16 }
17
18 bool DatagramSocket::connect(const SockAddr &addr)
19 {
20         SockAddr::SysAddr sa = addr.to_sys();
21         check_sys_connect_error(::connect(priv->handle, reinterpret_cast<const sockaddr *>(&sa.addr), sa.size));
22
23         delete peer_addr;
24         peer_addr = addr.copy();
25
26         delete local_addr;
27         SockAddr::SysAddr lsa;
28         getsockname(priv->handle, reinterpret_cast<sockaddr *>(&lsa.addr), &lsa.size);
29         local_addr = SockAddr::new_from_sys(lsa);
30
31         connected = true;
32
33         return true;
34 }
35
36 unsigned DatagramSocket::sendto(const char *buf, unsigned size, const SockAddr &addr)
37 {
38         if(size==0)
39                 return 0;
40
41         SockAddr::SysAddr sa = addr.to_sys();
42         return check_sys_error(::sendto(priv->handle, buf, size, 0, reinterpret_cast<const sockaddr *>(&sa.addr), sa.size), "sendto");
43 }
44
45 unsigned DatagramSocket::recvfrom(char *buf, unsigned size, SockAddr *&from_addr)
46 {
47         if(size==0)
48                 return 0;
49
50         SockAddr::SysAddr sa;
51         unsigned ret = check_sys_error(::recvfrom(priv->handle, buf, size, 0, reinterpret_cast<sockaddr *>(&sa.addr), &sa.size), "recvfrom");
52         from_addr = SockAddr::new_from_sys(sa);
53
54         return ret;
55 }
56
57 } // namespace Net
58 } // namespace Msp