Go to the documentation of this file.00001
00009
00010
00011
00012
00013 #include <cstring>
00014 #include <ecl/config/ecl.hpp>
00015 #include <ecl/errors/handlers.hpp>
00016 #include "../../include/ecl/io/sockets.hpp"
00017
00018
00019
00020
00021
00022 namespace ecl {
00023
00024 SocketError init_sockets(void) {
00025 #ifdef ECL_IS_WIN32
00026 static bool already_initialised = false;
00027 if ( !already_initialised ) {
00028 struct WSAData wsaData;
00029 int err;
00030
00031 if ( (err = WSAStartup(MAKEWORD(2, 0), &wsaData)) != 0) {
00032 switch( WSAGetLastError() ) {
00033 case(WSASYSNOTREADY) : { return SocketError(NotInitialisedError); }
00034 case(WSAVERNOTSUPPORTED) : { return SocketError(NotSupportedError); }
00035 case(WSAEINPROGRESS) : { return SocketError(BusyError); }
00036 case(WSAEPROCLIM) : { return SocketError(OutOfResourcesError); }
00037 case(WSAEFAULT) : { return SocketError(InvalidArgError); }
00038 default : { return SocketError(UnknownError); }
00039 }
00040 }
00041 }
00042 #endif
00043 return SocketError(NoError);
00044 }
00045
00046 SocketError close_socket(const socket_descriptor& socket) {
00047 #if defined(ECL_IS_WIN32)
00048 if ( ::closesocket(socket) == SOCKET_ERROR ) {
00049 switch(WSAGetLastError()) {
00050 case(WSANOTINITIALISED) : { return SocketError(NotInitialisedError); }
00051 case(WSAENETDOWN) : { return SocketError(SystemFailureError); }
00052 case(WSAENOTSOCK) : { return SocketError(InvalidArgError); }
00053 case(WSAEINTR) : { return SocketError(InterruptedError); }
00054 case(WSAEWOULDBLOCK) : { return SocketError(BlockingError); }
00055 default : { return SocketError(UnknownError); }
00056 }
00057 }
00058 #elif defined(ECL_IS_POSIX)
00059 if ( ::close(socket) != 0 ) {
00060 switch(errno) {
00061 case(EBADF) : { return SocketError(InvalidArgError); }
00062 case(EINTR) : { return SocketError(InterruptedError); }
00063 case(EIO) : { return SocketError(InterruptedError); }
00064 default : { return SocketError(UnknownError); }
00065 }
00066 }
00067 #endif
00068 return SocketError(NoError);
00069 }
00070
00071 SocketError shutdown_sockets() {
00072 #ifdef ECL_IS_WIN32
00073 if ( WSACleanup() == SOCKET_ERROR ) {
00074 switch(WSAGetLastError()) {
00075 case(WSANOTINITIALISED) : { return SocketError(NotInitialisedError); }
00076 case(WSAENETDOWN) : { return SocketError(SystemFailureError); }
00077 case(WSAEINPROGRESS) : { return SocketError(BusyError); }
00078 default : { return SocketError(UnknownError); }
00079 }
00080 }
00081 #endif
00082 return SocketError(NoError);
00083 }
00084
00085
00086 }