⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mtserver.cpp

📁 关于无线网络程序设计TCP/IP
💻 CPP
字号:
/*
Author :- Nish [BusterBoy]
EMail :- nishinapp@yahoo.com
*/

#include "stdafx.h"
#include "MTServer.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

CWinApp theApp;
SOCKET server;

using namespace std;

UINT  MTServerThread(LPVOID pParam);
UINT  ClientThread(LPVOID pParam);
BOOL ParseCmd(char *str, CString& cmd, CString& params);
BOOL SendFile(SOCKET s, CString fname);

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	int nRetCode = 0;	

	cout << "Press ESCAPE to terminate program\r\n";
	AfxBeginThread(MTServerThread,0);
	while(_getch()!=27);

	closesocket(server);
	WSACleanup();

	return nRetCode;
}


UINT  MTServerThread(LPVOID pParam)
{		
	WSADATA wsaData;
	sockaddr_in local;
	int wsaret=WSAStartup(0x101,&wsaData);
	if(wsaret!=0)
	{
		return 0;
	}
	local.sin_family=AF_INET;
	local.sin_addr.s_addr=INADDR_ANY;
	local.sin_port=htons((u_short)20248);
	server=socket(AF_INET,SOCK_STREAM,0);
	if(server==INVALID_SOCKET)
	{
		return 0;
	}
	if(bind(server,(sockaddr*)&local,sizeof(local))!=0)
	{
		return 0;
	}
	if(listen(server,10)!=0)
	{
		return 0;
	}

	SOCKET client;
	sockaddr_in from;
	int fromlen=sizeof(from);

	while(true)
	{
		client=accept(server,
			(struct sockaddr*)&from,&fromlen);
		AfxBeginThread(ClientThread,(LPVOID)client);	
	}	

	return 0;
}

UINT  ClientThread(LPVOID pParam)
{
	char buff[512];
	CString cmd;
	CString params;
	int n;
	int x;
	BOOL auth=false;
	SOCKET client=(SOCKET)pParam;
	strcpy(buff,"#Server Ready.\r\n");
	send(client,buff,strlen(buff),0);
	while(true)
	{
		n=recv(client,buff,512,0);
		if(n==SOCKET_ERROR )			
			break;
		buff[n]=0;
		if(ParseCmd(buff,cmd,params))
		{
			if(cmd=="QUIT")
				break;
			if(cmd=="AUTH")
			{
				if(params=="passwd")
				{
					auth=true;
					strcpy(buff,"#You are logged in.\r\n");
				}
				else
				{
					strcpy(buff,"!Bad password.\r\n");
				}
				send(client,buff,strlen(buff),0);
			}
			if(cmd=="FILE")
			{
				if(auth)
				{
					if(SendFile(client,params))
						sprintf(buff,"#File %s sent successfully.\r\n",params);
					else
						sprintf(buff,"!File %s could not be opened.\r\n",params);
					x=send(client,buff,strlen(buff),0);					
				}
				else
				{
					strcpy(buff,"!You are not logged in.\r\n");
					send(client,buff,strlen(buff),0);
				}
			}
		}
		else
		{
			strcpy(buff,"!Invalid command.\r\n");
			send(client,buff,strlen(buff),0);
		}
	}		

	closesocket(client);
	return 0;
}

BOOL ParseCmd(char *str, CString& cmd, CString& params)
{
	int n;
	CString tmp=str;	
	tmp.TrimLeft();
	tmp.TrimRight();	
	if((n=tmp.Find(' '))==-1)
	{
		tmp.MakeUpper();
		if(tmp!="QUIT")
			return false;
		cmd=tmp;
		return true;
	}		
	cmd=tmp.Left(n);
	params=tmp.Mid(n+1);
	cmd.MakeUpper();
	if((cmd!="AUTH") && (cmd!="FILE"))
		return false;
	return true;
}

BOOL SendFile(SOCKET s, CString fname)
{	
	CFile f;
	BOOL p=f.Open(fname,CFile::modeRead);	
	char buff[1024];
	int y;
	int x;
	if(!p)
		return false;
	while(true)
	{		
		y=f.Read(buff,1024);
		x=send(s,buff,y,0);		
		if(y<1024)
		{
			f.Close();
			break;
		}			
	}	

	return true;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -