2 #include <msp/strings/formatter.h>
3 #include "datagramsocket.h"
8 DatagramSocket::DatagramSocket(Family f, int p):
9 Socket(f, SOCK_DGRAM, p)
12 WSAEventSelect(handle, event, FD_READ|FD_CLOSE);
14 set_events(IO::P_INPUT);
17 int DatagramSocket::connect(const SockAddr &addr)
22 socklen_t size=addr.fill_sockaddr(sa);
24 int err=::connect(handle, reinterpret_cast<sockaddr *>(&sa), size);
26 throw SystemError("Unable to connect", errno);
29 peer_addr=addr.copy();
32 size=sizeof(sockaddr_storage);
33 getsockname(handle, reinterpret_cast<sockaddr *>(&sa), &size);
34 local_addr=SockAddr::create(sa);
41 unsigned DatagramSocket::sendto(const char *buf, unsigned size, const SockAddr &addr_)
48 sockaddr_storage addr;
49 socklen_t addr_len=addr_.fill_sockaddr(addr);
51 int ret=::sendto(handle, buf, size, 0, reinterpret_cast<sockaddr *>(&addr), addr_len);
57 throw SystemError("Sendto failed", errno);
63 unsigned DatagramSocket::recvfrom(char *buf, unsigned size, SockAddr *&addr_)
70 sockaddr_storage addr;
71 socklen_t addr_len=sizeof(sockaddr_storage);
73 int ret=::recvfrom(handle, buf, size, 0, reinterpret_cast<sockaddr *>(&addr), &addr_len);
79 throw SystemError("Recvfrom failed", errno);
82 addr_=SockAddr::create(addr);