//*****************************************************************************
// RCF - Remote Call Framework
// Copyright (c) 2005. All rights reserved.
// Developed by Jarl Lindrud.
// Contact: jlindrud@hotmail.com .
//*****************************************************************************
#ifndef INCLUDE_RCF_USINGBSDSOCKETS_HPP
#define INCLUDE_RCF_USINGBSDSOCKETS_HPP
#include <iostream>
#include <string>
#include <boost/config.hpp>
#include <RCF/Tools.hpp>
#include <RCF/util/Platform/OS/BsdSockets.hpp>
class BsdSocketsErrorInfo
{
public:
BsdSocketsErrorInfo() :
err(Platform::OS::BsdSockets::GetLastError()), msg(Platform::OS::GetErrorString(err))
{}
friend inline std::ostream &operator<<(std::ostream &os, const BsdSocketsErrorInfo &sei)
{
os << "Socket error: " << sei.err << ", Msg: " << sei.msg;
return os;
}
static BsdSocketsErrorInfo make()
{
return BsdSocketsErrorInfo();
}
private:
int err;
std::string msg;
};
// gcc 3.2 doesn't like this...
//#define RCF_VERIFY_SOCKETS(x, msg) UTIL_VERIFY(x, RCF::VerificationFailureException, msg)(BsdSocketsErrorInfo())
// , so we'll use this instead:
#define RCF_VERIFY_SOCKETS(x, msg) UTIL_VERIFY(x, RCF::VerificationFailureException, msg)(::BsdSocketsErrorInfo::make())
#ifdef BOOST_WINDOWS
// Winsock initialization and deinitialization for Windows builds
#include <RCF/InitDeinit.hpp>
namespace RCF {
inline void initWinsock()
{
WORD wVersion = MAKEWORD( 1, 0 );
WSADATA wsaData;
RCF_VERIFY_SOCKETS( 0 == WSAStartup( wVersion, &wsaData ), "WSAStartup()" );
}
inline void deinitWinsock()
{
WSACleanup();
}
RCF_ON_INIT_DEINIT( initWinsock(), deinitWinsock() )
} // namespace RCF
#endif // BOOST_WINDOWS
#endif // ! INCLUDE_RCF_USINGBSDSOCKETS_HPP