Beispiel #1
0
int ServerThread::InitServer(int max_connections)
// Initialize the server. Returns a non-zero value if any
// errors ocurr.
{
  if(InitSocketLibrary() == 0) {
    if(InitSocket(SOCK_STREAM, servercfg->port) < 0) return 1;
  }
  else {
    return 1;
  }

  int val = 1;
  if(SetSockOpt(gxsocket, SOL_SOCKET, SO_REUSEADDR,
		&val, sizeof(val)) < 0) {
    CheckSocketError((gxSocket *)this, "Error initializing server"); 
    Close();
    return 1;
  }

  // Bind the name to the socket
  if(Bind() < 0) {
    CheckSocketError((gxSocket *)this, "Error initializing server"); 
    Close();
    return 1;
  }
  
  // Listen for connections with a specified backlog
  if(Listen(max_connections) < 0) {
    CheckSocketError((gxSocket *)this, "Error initializing server");
    Close();
    return 1;
  }

  return 0;
}
Beispiel #2
0
void CProxy::send_error( int status, char* title, char* extra_header, char* text )
{
	char line[MAX_LEN];
	char szBuffer[MAX_LEN];
	int iSend;

    send_headers(200, title, extra_header, "text/html", -1, -1 );
    (void) sprintf( szBuffer, "<HTML><HEAD><TITLE>%d %s</TITLE></HEAD>\n<BODY><H4>%d %s</H4>\n", status, title, status, title );
    (void) sprintf( line, "%s\n", text );
	strcat(szBuffer, line);
    (void) sprintf( line, "<HR>\n<ADDRESS><A HREF=\"http://www.oddsock.org\">Oddsock Song Requester</A></ADDRESS>\n</BODY></HTML>\n");
	strcat(szBuffer, line);
	iSend = send(skAccept, szBuffer, strlen(szBuffer), 0);
	if (CheckSocketError(iSend, "Error on send() in send_error()"))
		return;

	return;
}
Beispiel #3
0
int CProxy::myfputs(char *szLine, SOCKET sock)
{
	int iSend;
	int iError;

	iSend = send(sock, szLine, strlen(szLine), 0);
	if (iSend == SOCKET_ERROR) {
		iError = WSAGetLastError();

		if (iError == WSAECONNRESET) {
			return(0);
		}
		
		if (CheckSocketError(iSend, "Error on send() in myfputs()"))
			return SOCKET_ERROR;
	}

	return iSend;
}
Beispiel #4
0
int CProxy::DoProxy(void)
{
	char line[MAX_LEN];
	int	iError, iLineLen;
	CString	relativefiletoRead;
	CString webroot;
	CString	filetoRead;
   int loop = 1;
   unsigned int nbytes = 255;
   char	*p1;
   char	content_type[25] = "";
   char	GET[25] = "GET";
   struct stat	statStruct;
   CString	strbuffer;
		char	msg[255] = "";
	char	searchstring[2046] = "";
	char	startswithstring[255] = "";
	char	errorcode[10] = "";
	int		searchflag = 0;
	int		startswithflag = 0;
	char	buffer[1024];

   int	totalSent = 0;
	CStdioFile file;
	FILE	*filep;
	char	*pszReferrer;
	char	*p2;
	char	tempURL2[1024] = "";
	char	tempURL3[256] = "";
	char	adminPass[255] = "";
	int		adminFlag = 0;
	int lengthtocopy = 0;
	char	*pp1 = 0;
	char	*pp2 = 0;


	memset(tempURL2, '\000', sizeof(tempURL2));
	memset(tempURL3, '\000', sizeof(tempURL3));
 
	memset(szRecvBuffer, 0, sizeof(szRecvBuffer));

	/* Read the first line of the request. */
	iError = recv(skAccept, szRecvBuffer, sizeof(szRecvBuffer)-1, 0);
	if (CheckSocketError(iError, "Couldn't read initial request")) {
		send_error( 400, "Bad Request", (char*) 0, "No request found." );
		goto ErrorExit;
	}


	memset(m_Referrer, '\000', sizeof(m_Referrer));

	strcpy(m_Referrer, "playlist.cgi");
	// Find end of first line
	pszReferrer = strstr(szRecvBuffer, "Referer: ");
	if (pszReferrer != 0) {
		p2 = strstr(pszReferrer, "&errorCode=");
		if (p2 == 0) {
			p2 = strstr(pszReferrer, "\r\n");
			if (p2 != 0) {
				memset(m_Referrer, '\000', sizeof(m_Referrer));
				strncpy(m_Referrer, pszReferrer + strlen("Referer: "), p2- (pszReferrer + strlen("Referer: ")));
			}
		}
		else {
			memset(m_Referrer, '\000', sizeof(m_Referrer));
			strncpy(m_Referrer, pszReferrer + strlen("Referer: "), p2- (pszReferrer + strlen("Referer: ")));
		}
	}
	m_pszEOL = strchr(szRecvBuffer, '\n');
	if (!m_pszEOL) {
		iLineLen = strlen(szRecvBuffer);

		if (iLineLen == 0) {
			socketErrorExit("Couldn't find end of line for first request");
			return 0;
		}

		m_pszEOL = szRecvBuffer + iLineLen;

	}

	m_pszEOL++;

	// Copy first line of recv() into line
	memset(line, 0, sizeof(line));

//	strncpy(line, szRecvBuffer, m_pszEOL - szRecvBuffer);
		strncpy(line, szRecvBuffer, sizeof(line)-1);

	// Calculate what's left in our buffer (excluding first line)
	m_iHeaderLen = iError - strlen(line);

    /* Parse it. */
    trim( line );

	if (strncmp(line, "GET ", 4)) {
		send_error( 400, "Only GET requests supported", (char*) 0, "Error" );
		goto ErrorExit;
	}
//    if ( sscanf( line, "%[^ ] %[^ ] %[^ ]", m_szMethod, m_szURL, m_szProtocol ) != 3 ) {

	pp1 = line + 4;
	pp2 = strchr(pp1, ' ');
	if (pp2 == 0) {
		send_error( 400, "Bad Request", (char*) 0, "Can't parse request." );
		goto ErrorExit;
	}

	memset(m_szURL, '\000', sizeof(m_szURL));
	if ((pp2-pp1) > sizeof(m_szURL) -1) {
		lengthtocopy = sizeof(m_szURL) - 1;
	}
	else {
		lengthtocopy = pp2-pp1;
	}
	strncpy(m_szURL, pp1, lengthtocopy);

	if (!strcmp(m_szURL, "/")) {
		strcat(m_szURL, "playlist.cgi");
	}
	strncpy(tempURL3, m_szURL, sizeof(tempURL3));
	if (!strncmp(m_szURL, "/?", 2)) {
		_snprintf(tempURL3, sizeof(tempURL3)-1, "/playlist.cgi%s", m_szURL+1);
		
	}
	if (!strncmp(m_szURL, "/&",2 )) {
		_snprintf(tempURL3, sizeof(tempURL3)-1, "/playlist.cgi%s", m_szURL+1);
	}
	strncpy(m_szURL, tempURL3, sizeof(m_szURL));

//	if (!strncmp(m_szURL, "/play.cgi", strlen("/play.cgi"))) {
//		PlayHandler(m_szURL);
//		goto NormalExit;
//	}
//	if (!strncmp(m_szURL, "/stop.cgi", strlen("/stop.cgi"))) {
//		StopHandler(m_szURL);
//		goto NormalExit;
//	}
	if (!strcmp(m_szURL, "/admin.cgi")) {
		sprintf(buffer, "HTTP/1.1 200 OK\nServer: WinampServer\nConnection: close\nContent-Type: text/html\r\n\r\n");
		iError = send(skAccept, buffer, strlen(buffer), 0);
		sprintf(buffer, "<html><form method=GET action=\"admin.cgi\">Enter Admin Password <input type=text name=pass><input type=Submit></form>");
		iError = send(skAccept, buffer, strlen(buffer), 0);
		goto NormalExit;
	}
	if (!strncmp(m_szURL, "/admin.cgi", strlen("/admin.cgi"))) {
		AdminHandler(m_szURL, &adminFlag);
	}
	if (!strncmp(m_szURL, "/request.cgi", strlen("/request.cgi"))) {
		RequestHandler(m_szURL);
		goto NormalExit;
	}
	
	p1 = strchr(m_szURL, '?');
	if (p1) {
		strncmp(tempURL2, m_szURL, p1-m_szURL);
	}
	else {
		p1 = strchr(m_szURL, '&');
		if (p1) {
			strncpy(tempURL2, m_szURL, p1-m_szURL);
		}
		else {
			strcpy(tempURL2, m_szURL);
		}
	}


	if ((!strncmp(m_szURL, "/playlist.cgi", strlen("/playlist.cgi"))) || (!strncmp(m_szURL, "/admin.cgi", strlen("/admin.cgi"))) || (!strcmp(tempURL2, "/"))) {
		memset(m_Current, '\000', sizeof(m_Current));
		PlaylistHandler(m_szURL, searchstring, startswithstring, m_Current, errorcode, &adminFlag);
		strcpy(content_type, "text/html");
		if (strlen(searchstring) == 0) {
			searchflag = 0;
		}
		else {
			searchflag = 1;
		}
		if (strlen(startswithstring) == 0) {
			startswithflag = 0;
		}
		else {
			startswithflag = 1;
		}
		relativefiletoRead = g_Playlistfile;
	}
	else {
		relativefiletoRead = m_szURL;
	}

	p1 = stristr(m_szURL, ".");
	if (p1) {
		p1++;
		if (strcmp(p1, "jpg") == 0) {
			strcpy(content_type, "image/jpeg");
		}
		if (strcmp(p1, "jpeg") == 0) {
			strcpy(content_type, "image/jpeg");
		}
		if (strcmp(p1, "gif") == 0) {
			strcpy(content_type, "image/gif");
		}
		if (strcmp(p1, "png") == 0) {
			strcpy(content_type, "image/png");
		}
		if (strcmp(p1, "css") == 0) {
			strcpy(content_type, "text/css");
		}
		if (strcmp(p1, "wav") == 0) {
			strcpy(content_type, "audio/wav");
		}
		if (strcmp(p1, "avi") == 0) {
			strcpy(content_type, "video/x-msvideo");
		}
		if (strcmp(p1, "mov") == 0) {
			strcpy(content_type, "video/quicktime");
		}
		if (strcmp(p1, "mpg") == 0) {
			strcpy(content_type, "video/mpeg");
		}
		if (strcmp(p1, "mpeg") == 0) {
			strcpy(content_type, "video/mpeg");
		}
		if (strcmp(p1, "vrml") == 0) {
			strcpy(content_type, "model/vrml");
		}
		if (strcmp(p1, "mp3") == 0) {
			strcpy(content_type, "audio/mpeg");
		}
		if (strcmp(p1, "pls") == 0) {
			strcpy(content_type, "audio/x-scpls");
		}
		if (strcmp(p1, "html") == 0) {
			strcpy(content_type, "text/html");
		}
	}

	if (relativefiletoRead.Left(2) == "/.") {
		sprintf(msg, "Invalid File %s - relative paths not supported", LPCSTR(relativefiletoRead));
		send_error( 400, msg, (char*) 0, "" );
		goto ErrorExit;
	}
	
	relativefiletoRead.Replace("/", "\\");
	webroot = g_WebRoot;
	if (g_WebRoot[strlen(g_WebRoot)] != '\\') {
		filetoRead = webroot + "\\" + relativefiletoRead;
	}
	else {
		filetoRead = webroot + relativefiletoRead;
	}

	filetoRead.Replace("\\\\", "\\");
	
	if (stat(filetoRead.GetBuffer(filetoRead.GetLength()), &statStruct) != 0) {
		sprintf(msg, "Invalid File %s", LPCSTR(relativefiletoRead));
		send_error( 400, msg, (char*) 0, "" );
		goto ErrorExit;
  	}

	
	
	if (!strcmp(content_type, "text/html")) {
		sprintf(buffer, "HTTP/1.1 200 OK\nServer: WinampServer\nConnection: close\nContent-Type: %s\r\n\r\n",content_type);
	}
	else {
		sprintf(buffer, "HTTP/1.1 200 OK\nServer: WinampServer\nContent-Length: %d\nConnection: close\nContent-Type: %s\r\n\r\n", statStruct.st_size,content_type);
	}
	iError = send(skAccept, buffer, strlen(buffer), 0);

	/* Read in input: */

	char	buf[8096];
	memset(buf, '\000', sizeof(buf));


	if (!strcmp(content_type, "text/html")) {
		filep = fopen(LPCSTR(filetoRead), "r");
		if (filep == NULL) {
			send_error( 400, "Invalid File", (char*) 0, "" );
			goto ErrorExit;
		}
		strbuffer = "";
		while (fgets(buf, sizeof(buf), filep) != NULL) {
			strbuffer = buf;
			if (!SubstituteTags(&strbuffer,skAccept, searchflag, searchstring, startswithflag, startswithstring, errorcode, adminFlag)) {
				iError = send(skAccept, strbuffer.GetBuffer(strbuffer.GetLength()), strbuffer.GetLength(), 0);
				iError = send(skAccept, "\r\n", strlen("\r\n"), 0);
				strbuffer = "";
			}
			memset(buf, '\000', sizeof(buf));
		}
		fclose(filep);
   }
   else {
	   FILE	*filep;
	   filep = fopen(LPCSTR(filetoRead), "rb");

		if (filep == 0) {
			send_error( 400, "Invalid File", (char*) 0, "" );
			goto ErrorExit;
		}
		int ret = 0;
		while (!feof(filep)) {
			memset(buf, '\000', sizeof(buf));
			ret = fread(buf, 1, sizeof(buf), filep);
			iError = send(skAccept, buf, ret, 0);
			totalSent = totalSent + iError;
		}
		fclose(filep);

   }
	closesocket(skClient);
	return 1;

NormalExit:
	closesocket(skClient);
	return 1;

ErrorExit:
	closesocket(skClient);
	return 0;
}
Beispiel #5
0
LPARAM OnClientSockMsg(WPARAM wParam, LPARAM lParam)
{
	switch (WSAGETSELECTEVENT(lParam))
	{
		case FD_CONNECT:
		{
			if (CheckSocketError(lParam))
			{
				if (InitServerThreadForMsg())
				{
					g_nRemainBuffLen = 0;

					KillTimer(g_hMainWnd, _ID_TIMER_CONNECTSERVER);
					
					SetTimer(g_hMainWnd, _ID_TIMER_KEEPALIVE, 50000, (TIMERPROC)OnTimerProc);
//					SetTimer(g_hMainWnd, _ID_TIMER_KEEPALIVE, 1000, (TIMERPROC)OnTimerProc);

					InsertLogMsg(IDS_CONNECT_LOGINSERVER);
					SendMessage(g_hStatusBar, SB_SETTEXT, MAKEWORD(1, 0), (LPARAM)_TEXT("Connected"));

					//
					UINT			dwThreadIDForMsg = 0;
					unsigned long	hThreadForMsg = 0;

					g_ClientIoEvent = WSACreateEvent();

					//hThreadForMsg = _beginthreadex(NULL, 0, ClientWorkerThread, NULL, 0, &dwThreadIDForMsg);
				}
			}
			else
			{
				closesocket(g_csock);
				g_csock = INVALID_SOCKET;

				SetTimer(g_hMainWnd, _ID_TIMER_CONNECTSERVER, 10000, (TIMERPROC)OnTimerProc);
			}

			break;
		}
/*		case FD_CLOSE:
		{
			closesocket(g_csock);
			g_csock = INVALID_SOCKET;

			KillTimer(g_hMainWnd, _ID_TIMER_KEEPALIVE);
			
			SetTimer(g_hMainWnd, _ID_TIMER_CONNECTSERVER, 10000, (TIMERPROC)OnTimerProc);

			InsertLogMsg(IDS_DISCONNECT_LOGINSERVER);
			SendMessage(g_hStatusBar, SB_SETTEXT, MAKEWORD(1, 0), (LPARAM)_TEXT("Not Connected"));

			break;
		}
		case FD_READ:
		{
			char	szPacket[1024];
	
			int nRecv = recv((SOCKET)wParam, szPacket, sizeof(szPacket), 0);

			szPacket[nRecv] = '\0';

			ProcReceiveBuffer(szPacket, nRecv);

			break;
		}
*/	}

	return 0L;
}
Beispiel #6
0
LRESULT CClientSocket::OnSocketMessage(WPARAM wParam, LPARAM lParam)
{
	if ( !CheckSocketError(lParam) )
	{
		PostQuitMessage(NULL);
		return FALSE;
	}

	switch ( WSAGETSELECTEVENT(lParam) )
	{
		case FD_CONNECT:
		{
			ZeroMemory(m_szBuff, sizeof(m_szBuff));
			m_nCurRecv = 0;

			if (m_pxDefProc)
				m_pxDefProc->OnConnectToServer();

			break;
		}
		case FD_CLOSE:
		{
			DisconnectToServer();
			
			break;
		}
		case FD_READ:
		{
			int		nRecv, nCurRecv = 0;

			if (g_bProcState == _GAME_PROC)
			{
				ioctlsocket((SOCKET)wParam, FIONREAD, (u_long *)&nRecv);

				char* pszPacket = new char[nRecv + 1];

				while (nRecv > nCurRecv)
					nCurRecv	+= recv((SOCKET)wParam, &pszPacket[nCurRecv], nRecv - nCurRecv, 0);

				pszPacket[nCurRecv] = '\0';

#ifdef _DEBUG
				_RPT1(_CRT_WARN, "RECV:%s\n", pszPacket);
#endif
				PacketQ.PushQ((BYTE*)pszPacket);
			}
			else
			{
				ioctlsocket((SOCKET)wParam, FIONREAD, (u_long *)&nRecv);
				
				while (nRecv > nCurRecv)
				{
					nCurRecv	+= recv((SOCKET)wParam, &m_szBuff[m_nCurRecv], nRecv - nCurRecv, 0);
					m_nCurRecv	+= nCurRecv;
				}

				m_szBuff[m_nCurRecv] = '\0';

				if (m_pxDefProc)
				{
					char *pszRemain = m_pxDefProc->OnMessageReceive(m_szBuff);

					if (pszRemain)
					{
						m_nCurRecv = strlen(pszRemain);
						memcpy(m_szBuff, pszRemain, m_nCurRecv);
					}
					else
					{
						m_nCurRecv = 0;
						ZeroMemory(m_szBuff, sizeof(m_szBuff));
					}
				}
			}

			break;
		}
	}

	return 0L;
}
LPARAM OnClientSockMsg(WPARAM wParam, LPARAM lParam)
{
	switch (WSAGETSELECTEVENT(lParam))
	{
		case FD_CONNECT:
		{
			if (CheckSocketError(lParam))
			{
				InsertLogMsg(IDS_CONNECT_DBSERVER);

				KillTimer(g_hMainWnd, _ID_TIMER_CONNECTSERVER);

				UINT			dwThreadIDForMsg = 0;
				unsigned long	hThreadForMsg = 0;

//				SetTimer(g_hMainWnd, _ID_TIMER_PROCESSUSERHUMAN, 1, (TIMERPROC)OnProcessUserHuman);
				if (hThreadForMsg = _beginthreadex(NULL, 0, ProcessLogin, NULL, 0, &dwThreadIDForMsg))
				{
//					SetThreadPriority((HANDLE)hThreadForMsg, THREAD_PRIORITY_HIGHEST);
					hThreadForMsg = _beginthreadex(NULL, 0, ProcessUserHuman, NULL, 0, &dwThreadIDForMsg);
					hThreadForMsg = _beginthreadex(NULL, 0, ProcessMonster, NULL, 0, &dwThreadIDForMsg);
					hThreadForMsg = _beginthreadex(NULL, 0, ProcessNPC, NULL, 0, &dwThreadIDForMsg);
				}

				int nPort;

				if (!jRegGetKey(_GAME_SERVER_REGISTRY, _TEXT("LocalPort"), (LPBYTE)&nPort))
					nPort = 5000;

				InitServerSocket(g_ssock, &g_saddr, _IDM_SERVERSOCK_MSG, nPort, 1);

				InsertLogMsg(IDS_STARTSERVICE);
				SendMessage(g_hStatusBar, SB_SETTEXT, MAKEWORD(0, 0), (LPARAM)_T("Ready"));
			}
			else
			{
				closesocket(g_csock);
				g_csock = INVALID_SOCKET;

				SetTimer(g_hMainWnd, _ID_TIMER_CONNECTSERVER, 10000, (TIMERPROC)OnTimerProc);
			}

			break;
		}
		case FD_CLOSE:
		{
			closesocket(g_csock);
			g_csock = INVALID_SOCKET;

			InsertLogMsg(IDS_DISCONNECT_DBSERVER);

			break;
		}
		case FD_READ:
		{
			char	szPacket[8096];
	
			int nRecv = recv((SOCKET)wParam, szPacket, sizeof(szPacket), 0);

#ifdef _DEBUG
			_RPT1(_CRT_WARN, "ClientSockMsg[FD_READ]:%d\n", nRecv);
#endif
			szPacket[nRecv] = '\0';

			ProcReceiveBuffer(szPacket, nRecv);

			break;
		}
	}

	return 0L;
}
Beispiel #8
0
LPARAM OnClientSockMsg(WPARAM wParam, LPARAM lParam)
{
	switch (WSAGETSELECTEVENT(lParam))
	{
		case FD_CONNECT:
		{
			DWORD dwThreadIDForMsg = 0;

			if (CheckSocketError(lParam))
			{
				dwThreadIDForMsg = 0;

				if (InitThread(ThreadFuncForMsg))
				{
					KillTimer(g_hMainWnd, _ID_TIMER_CONNECTSERVER);
				
					SetTimer(g_hMainWnd, _ID_TIMER_KEEPALIVE, 5000, (TIMERPROC)OnTimerProc);

					InsertLogMsg(IDS_CONNECT_LOGINSERVER);
					SendMessage(g_hStatusBar, SB_SETTEXT, MAKEWORD(1, 0), (LPARAM)_TEXT("Connected"));
				}
			}
			else
			{
				closesocket(g_csock);
				g_csock = INVALID_SOCKET;

				SetTimer(g_hMainWnd, _ID_TIMER_CONNECTSERVER, 10000, (TIMERPROC)OnTimerProc);
			}

			break;
		}
		case FD_CLOSE:
		{
			closesocket(g_csock);
			g_csock = INVALID_SOCKET;

			OnCommand(IDM_STOPSERVICE, 0);

			break;
		}
		case FD_READ:
		{
			int		nSocket = 0;
			char	*pszFirst = NULL, *pszEnd = NULL;

			UINT nRecv = 0;

			ioctlsocket((SOCKET)wParam, FIONREAD, (u_long *)&nRecv);

			if (nRecv)
			{
				char *pszPacket = new char[nRecv + 1];

				nRecv = recv((SOCKET)wParam, pszPacket, nRecv, 0);

				pszPacket[nRecv] = '\0';

				if (!(g_xMsgQueue.PushQ((BYTE *)pszPacket)))
					InsertLogMsg(_TEXT("[INFO] Not enough queue(g_xMsgQueue) buffer."));
			}

			break;
		}
	}

	return 0L;
}