00001
00002
00003
00004
00005
00006 #include "stdafx.h"
00007 #include "vmsHttpServer.h"
00008 #include "vmsHttpConnection.h"
00009 #include "vmsHttpResourceContainer.h"
00010
00011 vmsHttpServer::vmsHttpServer(vmsHttpResourceContainer* pResources)
00012 {
00013 m_sServer = INVALID_SOCKET;
00014 m_hStopEvent = CreateEvent (NULL, TRUE, FALSE, NULL);
00015 m_nPort = 80;
00016 m_pResources = pResources;
00017 m_bServerRunning = FALSE;
00018 }
00019
00020 vmsHttpServer::~vmsHttpServer()
00021 {
00022 Shutdown ();
00023 CloseHandle (m_hStopEvent);
00024 }
00025
00026 BOOL vmsHttpServer::Start()
00027 {
00028 if (m_bServerRunning)
00029 return FALSE;
00030
00031 m_sServer = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
00032 if (m_sServer == INVALID_SOCKET)
00033 return FALSE;
00034
00035 sockaddr_in addr;
00036 addr.sin_family = AF_INET;
00037 addr.sin_addr.s_addr = htonl (INADDR_ANY);
00038 addr.sin_port = htons (m_nPort);
00039
00040 BOOL so_opt_val = TRUE;
00041 setsockopt (m_sServer, SOL_SOCKET, SO_REUSEADDR, (char*)&so_opt_val, sizeof (so_opt_val));
00042
00043 if (bind (m_sServer, (sockaddr*) &addr, sizeof (addr)))
00044 return FALSE;
00045
00046 m_bServerRunning = TRUE;
00047
00048 DWORD dw;
00049 CloseHandle (
00050 CreateThread (NULL, 0, _threadServer, this, 0, &dw));
00051
00052 return TRUE;
00053 }
00054
00055 DWORD WINAPI vmsHttpServer::_threadServer(LPVOID lp)
00056 {
00057 vmsHttpServer *pthis = (vmsHttpServer*) lp;
00058
00059 ULONG ul = 1;
00060 ioctlsocket (pthis->m_sServer, FIONBIO, &ul);
00061
00062 while (WaitForSingleObject (pthis->m_hStopEvent, 10) == WAIT_TIMEOUT)
00063 {
00064
00065
00066 if (listen (pthis->m_sServer, SOMAXCONN))
00067 continue;
00068
00069 SOCKET sConnection = accept (pthis->m_sServer, NULL, 0);
00070 if (sConnection == INVALID_SOCKET)
00071 continue;
00072
00073
00074 vmsHttpConnection *connection = new vmsHttpConnection (pthis);
00075 connection->Attach (sConnection);
00076 pthis->m_vConnections.push_back (connection);
00077 }
00078
00079 for (int i = 0; i < pthis->m_vConnections.size (); i++)
00080 delete pthis->m_vConnections [i];
00081 pthis->m_vConnections.clear ();
00082
00083 ul = 0;
00084 ioctlsocket (pthis->m_sServer, FIONBIO, &ul);
00085
00086 shutdown (pthis->m_sServer, 2);
00087 closesocket (pthis->m_sServer);
00088 pthis->m_sServer = INVALID_SOCKET;
00089
00090 pthis->m_bServerRunning = FALSE;
00091 return 0;
00092 }
00093
00094 vmsHttpResourceContainer* vmsHttpServer::get_ResourceContainer()
00095 {
00096 return m_pResources;
00097 }
00098
00099 void vmsHttpServer::Shutdown()
00100 {
00101 if (m_bServerRunning == FALSE)
00102 return;
00103
00104 SetEvent (m_hStopEvent);
00105 while (m_bServerRunning)
00106 Sleep (10);
00107 ResetEvent (m_hStopEvent);
00108 }
00109
00110 unsigned short vmsHttpServer::get_Port()
00111 {
00112 return m_nPort;
00113 }
00114
00115 void vmsHttpServer::set_Port(unsigned short nPort)
00116 {
00117 m_nPort = nPort;
00118 }