2 #include <msp/strings/format.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);