一种基于TCP/IP协议的网络编程模式(并发式多线程编程)

基本框架图:

一种基于TCP/IP协议的网络编程模式(并发式多线程编程)_第1张图片

举例:(远程控制软件的服务器代码框架)

// FileNetServer.cpp : Defines the entry point for the console application.
//
#include <winsock.h>
#include <windows.h>


#define BUF_LEN 1024

#define CHUNK_SIZE (64*1024)

#define GetDriver     0x01
#define GetDirInfo    0x02
#define ExecFile      0x03
#define GetFile       0x04
#define PutFile       0x05
#define DelFile       0x06
#define DelDir        0x07
#define CreateDir     0x08
#define FileInfo      0x09
#define GetScreen     0x10 

#pragma comment(lib, "ws2_32")

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


typedef struct
{
	int ID;
	BYTE lparam[BUF_LEN*2];
}COMMAND;
/*BOOL 4byte HICON 4byte*/
typedef struct
{
	char FileName[MAX_PATH];//260byte
	int FileLen;
	char Time[50];
	BOOL IsDir;
	BOOL Error;
	HICON hIcon;
}FILEINFO;


BOOL DeleteDirectory(char *DirName);
BOOL CapScreen(LPTSTR FileName);

DWORD WINAPI SLisen(LPVOID lparam);
DWORD GetDriverProc(COMMAND command, SOCKET client);
DWORD GetDirInfoProc(COMMAND command, SOCKET client);
DWORD ExecFileProc(COMMAND command, SOCKET client);
DWORD DelFileProc(COMMAND command, SOCKET client);
DWORD FileInfoProc(COMMAND command, SOCKET client);
DWORD CreateDirProc(COMMAND command, SOCKET client);
DWORD DelDirProc(COMMAND command, SOCKET client);
DWORD GetFileProc(COMMAND command, SOCKET client);
DWORD PutFileProc(COMMAND command, SOCKET client);
DWORD GetScreenProc(COMMAND command, SOCKET client);

/////////////////////////////////////////////////////////////////////////////
// The one and only application object

CWinApp theApp;

using namespace std;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{

	WSADATA wsadata;
	SOCKET FileNetServer;
	SOCKET client;
	SOCKADDR_IN FileNetServeraddr;
	SOCKADDR_IN clientaddr;
	int port = 17329;

	WORD ver = MAKEWORD(2,2);
	WSAStartup(ver, &wsadata);

	FileNetServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	FileNetServeraddr.sin_family = AF_INET;
	FileNetServeraddr.sin_port = htons(port);
	FileNetServeraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

	bind(FileNetServer, (SOCKADDR*)&FileNetServeraddr, sizeof(FileNetServeraddr));

	listen(FileNetServer, 5);

	int len = sizeof(clientaddr);
	char s_password[100];

	while(true)
	{
		if(client = accept(FileNetServer, (sockaddr*)&clientaddr, &len))
		{

			if(send(client, "Password", sizeof("Password"), 0) != SOCKET_ERROR)
			{
				cout<<"有客户请求连接,正在等待客户输入密码!";
			}
ag:         if(recv(client, s_password, sizeof(s_password), 0) != SOCKET_ERROR)
			{
				if(strcmp(s_password, "123") == 0)
				{
					send(client, "OK", sizeof("OK"), 0);
                    cout<<"CreateThread is the OK \n";
			        CreateThread(NULL, NULL, SLisen, (LPVOID)client, NULL, NULL);
				}
				else
				{
					cout<<"有用户试图联入,但是未能输入正确密码!/n";
					send(client, "NOOK", sizeof("NOOK"), 0);
					goto ag;
				}
			}
		}
	}

	closesocket(FileNetServer);
	closesocket(client);
	WSACleanup();



	return 0;
}

DWORD WINAPI SLisen(LPVOID lparam)
{
	SOCKET client = (SOCKET)lparam;

	COMMAND command;

	while(1)
	{
		memset((char*)&command, 0, sizeof(command));
		if(recv(client, (char*)&command, sizeof(command), 0) == SOCKET_ERROR)
		{
			cout<<"The Client Socket is Closed\n";
			break;
		}
		else
		{
			cout<<"The recv command is: ID="<<command.ID<<"  lparam="<<command.lparam<<endl;
			switch(command.ID)
			{
			case GetDriver:
				GetDriverProc(command, client);
				break;
			case GetDirInfo:
				GetDirInfoProc(command, client);
				break;
			case ExecFile:
				ExecFileProc(command, client);
				break;
			case DelFile:
				DelFileProc(command, client);
				break;
			case FileInfo:
				FileInfoProc(command, client);
				break;
			case CreateDir:
				CreateDirProc(command, client);
				break;
			case DelDir:
				DelDirProc(command, client);
				break;
			case GetFile:
				GetFileProc(command, client);
				break;
			case PutFile:
				PutFileProc(command, client);
				break;
			case GetScreen:
				GetScreenProc(command, client);
				break;
		    default:
				cout<<"Can not recongnize the command!\n";
				break;
			}
		}
	}
	closesocket(client);
	return 0;
}

DWORD GetDriverProc(COMMAND command, SOCKET client)
{
	cout<<"GetDriver is ok\n";

	COMMAND cmd;
	memset((char *)&cmd, 0, sizeof(cmd));
	cmd.ID = GetDriver;

	for(char i='A'; i<'Z'; i++)
	{
		char x[20] = {i, ':'};

		UINT Type = GetDriveType(x);

		if(Type==DRIVE_FIXED || Type==DRIVE_REMOVABLE || Type==DRIVE_CDROM)
		{
			cout<<x<<"\n";
			memset((char*)cmd.lparam, 0, sizeof(cmd.lparam));
			strcpy((char*)cmd.lparam, x);

			if(send(client, (char*)&cmd, sizeof(cmd), 0) == SOCKET_ERROR)
			{
				cout<<"Send Driver is Error\n";
			}
		}
	}
	return 0;
}

DWORD GetDirInfoProc(COMMAND command, SOCKET client)
{

}

DWORD ExecFileProc(COMMAND command, SOCKET client)
{

}

DWORD DelFileProc(COMMAND command, SOCKET client)
{

}

DWORD FileInfoProc(COMMAND command, SOCKET client)
{

}

DWORD CreateDirProc(COMMAND command, SOCKET client)
{

}

DWORD DelDirProc(COMMAND command, SOCKET client)
{

}

BOOL DeleteDirectory(char *DirName)
{

}

DWORD GetFileProc(COMMAND command, SOCKET client)
{

}

DWORD PutFileProc(COMMAND command, SOCKET client)
{

	return 0;
}

DWORD GetScreenProc(COMMAND command, SOCKET client)
{

	return 0;
}

BOOL CapScreen(LPTSTR FileName)
{
	return 0;
}

整个工程的源代码下载地址:http://download.csdn.net/detail/nuptboyzhb/4590088

你可能感兴趣的:(一种基于TCP/IP协议的网络编程模式(并发式多线程编程))