]> git.tdb.fi Git - libs/net.git/blob - source/datagramsocket.cpp
Initial revision
[libs/net.git] / source / datagramsocket.cpp
1 /* $Id$
2
3 This file is part of libmspnet
4 Copyright © 2008  Mikkosoft Productions, Mikko Rasa
5 Distributed under the LGPL
6 */
7
8 #include <errno.h>
9 #include <msp/strings/formatter.h>
10 #include "datagramsocket.h"
11
12 namespace Msp {
13 namespace Net {
14
15 DatagramSocket::DatagramSocket(Family f, int p):
16         Socket(f, SOCK_DGRAM, p)
17 { }
18
19 int DatagramSocket::connect(const SockAddr &addr)
20 {
21         check_state(false);
22
23         sockaddr sa;
24         socklen_t size=addr.fill_sockaddr(sa);
25
26         int err=::connect(handle, &sa, size);
27         if(err==-1)
28                 throw Exception(format("Unable to connect: %s", strerror(errno)));
29
30         delete peer_addr;
31         peer_addr=addr.copy();
32
33         delete local_addr;
34         size=sizeof(sockaddr);
35         getsockname(handle, &sa, &size);
36         local_addr=SockAddr::create(sa);
37
38         connected=true;
39
40         return (err==0)?0:1;
41 }
42
43 unsigned DatagramSocket::sendto(const char *buf, unsigned size, const SockAddr &addr_)
44 {
45         check_state(false);
46
47         if(size==0)
48                 return 0;
49
50         sockaddr addr;
51         socklen_t addr_len=addr_.fill_sockaddr(addr);
52
53         int ret=::sendto(handle, buf, size, 0, &addr, addr_len);
54         if(ret<0)
55         {
56                 if(errno==EAGAIN)
57                         return 0;
58                 else
59                         throw Exception(format("Sendto failed: %s", strerror(errno)));
60         }
61
62         return ret;
63 }
64
65 unsigned DatagramSocket::recvfrom(char *buf, unsigned size, SockAddr *&addr_)
66 {
67         check_state(false);
68
69         if(size==0)
70                 return 0;
71
72         sockaddr addr;
73         socklen_t addr_len=sizeof(sockaddr);
74
75         int ret=::recvfrom(handle, buf, size, 0, &addr, &addr_len);
76         if(ret<0)
77         {
78                 if(errno==EAGAIN)
79                         return 0;
80                 else
81                         throw Exception(format("Recvfrom failed: %s", strerror(errno)));
82         }
83
84         addr_=SockAddr::create(addr);
85
86         return ret;
87 }
88
89 IO::PollEvent DatagramSocket::get_initial_events() const
90 {
91         return IO::P_INPUT;
92 }
93
94 } // namespace Net
95 } // namespace Msp