]> git.tdb.fi Git - libs/net.git/blob - source/datagramsocket.cpp
Add function to check if handshake is done
[libs/net.git] / source / datagramsocket.cpp
1 /* $Id$
2
3 This file is part of libmspnet
4 Copyright © 2008, 2011  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 #ifdef WIN32
19         WSAEventSelect(handle, event, FD_READ|FD_CLOSE);
20 #endif
21         set_events(IO::P_INPUT);
22 }
23
24 int DatagramSocket::connect(const SockAddr &addr)
25 {
26         check_state(false);
27
28         sockaddr_storage sa;
29         socklen_t size=addr.fill_sockaddr(sa);
30
31         int err=::connect(handle, reinterpret_cast<sockaddr *>(&sa), size);
32         if(err==-1)
33                 throw SystemError("Unable to connect", errno);
34
35         delete peer_addr;
36         peer_addr=addr.copy();
37
38         delete local_addr;
39         size=sizeof(sockaddr_storage);
40         getsockname(handle, reinterpret_cast<sockaddr *>(&sa), &size);
41         local_addr=SockAddr::create(sa);
42
43         connected=true;
44
45         return (err==0)?0:1;
46 }
47
48 unsigned DatagramSocket::sendto(const char *buf, unsigned size, const SockAddr &addr_)
49 {
50         check_state(false);
51
52         if(size==0)
53                 return 0;
54
55         sockaddr_storage addr;
56         socklen_t addr_len=addr_.fill_sockaddr(addr);
57
58         int ret=::sendto(handle, buf, size, 0, reinterpret_cast<sockaddr *>(&addr), addr_len);
59         if(ret<0)
60         {
61                 if(errno==EAGAIN)
62                         return 0;
63                 else
64                         throw SystemError("Sendto failed", errno);
65         }
66
67         return ret;
68 }
69
70 unsigned DatagramSocket::recvfrom(char *buf, unsigned size, SockAddr *&addr_)
71 {
72         check_state(false);
73
74         if(size==0)
75                 return 0;
76
77         sockaddr_storage addr;
78         socklen_t addr_len=sizeof(sockaddr_storage);
79
80         int ret=::recvfrom(handle, buf, size, 0, reinterpret_cast<sockaddr *>(&addr), &addr_len);
81         if(ret<0)
82         {
83                 if(errno==EAGAIN)
84                         return 0;
85                 else
86                         throw SystemError("Recvfrom failed", errno);
87         }
88
89         addr_=SockAddr::create(addr);
90
91         return ret;
92 }
93
94 } // namespace Net
95 } // namespace Msp