-#ifdef _WIN32
-#include <winsock2.h>
-#endif
-#include <cerrno>
+#include "platform_api.h"
#include <msp/core/systemerror.h>
#include <msp/io/handle_private.h>
#include <msp/strings/format.h>
DatagramSocket::DatagramSocket(Family f, int p):
ClientSocket(f, SOCK_DGRAM, p)
{
-#ifdef _WIN32
- WSAEventSelect(priv->handle, *priv->event, FD_READ|FD_CLOSE);
-#endif
- set_events(IO::P_INPUT);
+ set_socket_events(S_INPUT);
}
bool DatagramSocket::connect(const SockAddr &addr)
{
SockAddr::SysAddr sa = addr.to_sys();
-
- int err = ::connect(priv->handle, reinterpret_cast<sockaddr *>(&sa.addr), sa.size);
- if(err==-1)
- {
-#ifdef _WIN32
- throw system_error("connect", WSAGetLastError());
-#else
- throw system_error("connect");
-#endif
- }
+ check_sys_connect_error(::connect(priv->handle, reinterpret_cast<const sockaddr *>(&sa.addr), sa.size));
delete peer_addr;
peer_addr = addr.copy();
return true;
}
-unsigned DatagramSocket::sendto(const char *buf, unsigned size, const SockAddr &addr)
+size_t DatagramSocket::sendto(const char *buf, size_t size, const SockAddr &addr)
{
if(size==0)
return 0;
SockAddr::SysAddr sa = addr.to_sys();
-
- int ret = ::sendto(priv->handle, buf, size, 0, reinterpret_cast<sockaddr *>(&sa.addr), sa.size);
- if(ret<0)
- {
- if(errno==EAGAIN)
- return 0;
- else
- {
-#ifdef _WIN32
- throw system_error("sendto", WSAGetLastError());
-#else
- throw system_error("sendto");
-#endif
- }
- }
-
- return ret;
+ return check_sys_error(::sendto(priv->handle, buf, size, 0, reinterpret_cast<const sockaddr *>(&sa.addr), sa.size), "sendto");
}
-unsigned DatagramSocket::recvfrom(char *buf, unsigned size, SockAddr *&from_addr)
+size_t DatagramSocket::recvfrom(char *buf, size_t size, SockAddr *&from_addr)
{
if(size==0)
return 0;
SockAddr::SysAddr sa;
- int ret = ::recvfrom(priv->handle, buf, size, 0, reinterpret_cast<sockaddr *>(&sa.addr), &sa.size);
- if(ret<0)
- {
- if(errno==EAGAIN)
- return 0;
- else
- {
-#ifdef _WIN32
- throw system_error("recvfrom", WSAGetLastError());
-#else
- throw system_error("recvfrom");
-#endif
- }
- }
-
+ size_t ret = check_sys_error(::recvfrom(priv->handle, buf, size, 0, reinterpret_cast<sockaddr *>(&sa.addr), &sa.size), "recvfrom");
from_addr = SockAddr::new_from_sys(sa);
return ret;