Main Page   Namespace List   Class Hierarchy   Compound List   File List   Compound Members   File Members  

socket_generic.cpp

Go to the documentation of this file.
00001 
00002 #ifdef WIN32
00003 #pragma warning (disable:4786)
00004 #endif
00005 
00006 #include "socket_generic.h"
00007 
00009 // CL_Socket_Generic static operations:
00010 
00011 sockaddr_in CL_Socket_Generic::create_sockaddr_in(const CL_IPAddress &address)
00012 {
00013         sockaddr_in addr_in;
00014         memset(&addr_in, 0, sizeof(addr_in));
00015         addr_in.sin_family = AF_INET;
00016         addr_in.sin_addr.S_un.S_addr = address.get_address();
00017         addr_in.sin_port = htons(address.get_port());
00018         return addr_in;
00019 }
00020 
00021 CL_IPAddress CL_Socket_Generic::create_ip_address(const sockaddr_in &addr_in)
00022 {
00023         return CL_IPAddress(addr_in.sin_addr.S_un.S_addr, ntohs(addr_in.sin_port));
00024 }
00025 
00027 // CL_Socket_Generic construction:
00028 
00029 CL_Socket_Generic::CL_Socket_Generic()
00030 : ref_count(0), sock(-1), read(NULL), write(NULL), exception(NULL)
00031 {
00032 }
00033 
00034 CL_Socket_Generic::~CL_Socket_Generic()
00035 {
00036         delete read;
00037         delete write;
00038         delete exception;
00039 }
00040 
00042 // CL_Socket_Generic attributes:
00043 
00045 // CL_Socket_Generic operations:
00046 
00047 void CL_Socket_Generic::add_ref()
00048 {
00049         ref_count++;
00050 }
00051 
00052 void CL_Socket_Generic::release_ref()
00053 {
00054         ref_count--;
00055         if (ref_count == 0)
00056         {
00057                 closesocket(sock);
00058                 delete this;
00059         }
00060 }
00061 
00063 // CL_Socket_Generic overridables:
00064 
00065 CL_EventTrigger_Socket *CL_Socket_Generic::create_read_trigger()
00066 {
00067         return new CL_EventTrigger_Socket(this, CL_EventTrigger_Socket::read);
00068 }
00069 
00070 CL_EventTrigger_Socket *CL_Socket_Generic::create_write_trigger()
00071 {
00072         return new CL_EventTrigger_Socket(this, CL_EventTrigger_Socket::write);
00073 }
00074 
00075 CL_EventTrigger_Socket *CL_Socket_Generic::create_exception_trigger()
00076 {
00077         return new CL_EventTrigger_Socket(this, CL_EventTrigger_Socket::exception);
00078 }
00079 
00080 void CL_Socket_Generic::keep_alive()
00081 {
00082         // performance note: it would be much more efficient if we maintained a global
00083         // list of all sockets instanciated, and then do one select for them all.
00084         //
00085         // I'm too lazy to do that - at least until it becomes a real performance problem.
00086         // -- mbn 2. marts 2001
00087 
00088         fd_set rfds, wfds, efds;
00089         FD_ZERO(&rfds);
00090         FD_ZERO(&wfds);
00091         FD_ZERO(&efds);
00092 
00093         FD_SET(sock, &rfds);
00094         FD_SET(sock, &wfds);
00095         FD_SET(sock, &efds);
00096 
00097         timeval tv;
00098         tv.tv_sec = 0;
00099         tv.tv_usec = 0;
00100 
00101         int result = select(sock+1, &rfds, &wfds, &efds, &tv);
00102         if (result > 0)
00103         {
00104                 if (FD_ISSET(sock, &rfds)) sig_read_triggered();
00105                 if (FD_ISSET(sock, &wfds)) sig_write_triggered();
00106                 if (FD_ISSET(sock, &efds)) sig_exception_triggered();
00107         }
00108 }
00109 
00111 // CL_Socket_Generic implementation:

Generated at Wed Apr 4 19:54:03 2001 for ClanLib by doxygen1.2.6 written by Dimitri van Heesch, © 1997-2001