00001
00002 #ifdef WIN32
00003 #pragma warning (disable:4786)
00004 #endif
00005
00006 #include "socket_generic.h"
00007
00009
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
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
00043
00045
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
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
00083
00084
00085
00086
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