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

📄 np_hw3.cpp

📁 it s a homework for network programming if you have the same homework like this you can take it
💻 CPP
字号:
#include <windows.h>
#include <string.h>
#include <stdio.h>
#include <fstream>
#include <list>
using namespace std;

#include "resource.h"

#define SERVER_PORT 7799
#define SERVER_NUM 5#define SERVER_IP_LEN 20#define SERVER_PORT_LEN 10#define FILE_LEN 20

#define F_CONNECTING 0#define F_READING 1#define F_WRITING 2#define F_DONE 3

//read buffer size#define READ_BUF_SIZE 1024

#define WM_SOCKET_NOTIFY (WM_USER + 1)
#define CGI_SOCKET_NOTIFY (SERVER_NUM + 1)

BOOL CALLBACK MainDlgProc(HWND, UINT, WPARAM, LPARAM);
int EditPrintf (HWND, TCHAR *, ...);
void parse_query_string(char * query_string);
int readline(FILE *fd, char *ptr, int maxlen);
void open_file(HWND hwndEdit);
void connect_server(HWND hwndEdit, HWND hwnd);
void send_html_header(SOCKET ssock);
//=================================================================
//	Global Variables
//=================================================================
list<SOCKET> Socks;

//server ip port filenamechar server_ip[SERVER_NUM][SERVER_IP_LEN];char server_port[SERVER_NUM][SERVER_PORT_LEN];char file_name[SERVER_NUM][FILE_LEN];

FILE *fd[SERVER_NUM];

SOCKET client_fd[SERVER_NUM];

struct sockaddr_in address[SERVER_NUM];
struct hostent * host;

int state[SERVER_NUM]; 
int conn = 0;

HINSTANCE hInst; 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
	LPSTR lpCmdLine, int nCmdShow)
{	
	hInst = hInstance;
	
	return DialogBox(hInstance, MAKEINTRESOURCE(ID_MAIN), NULL, MainDlgProc);
}

BOOL CALLBACK MainDlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
	WSADATA wsaData;

	static HWND hwndEdit;
	static SOCKET msock, ssock;
	static struct sockaddr_in sa;

	int err;
	int i;

	switch(Message) 
	{
		case WM_INITDIALOG:
			hwndEdit = GetDlgItem(hwnd, IDC_RESULT);
			break;
		case WM_COMMAND:
			switch(LOWORD(wParam))
			{
				case ID_LISTEN:

					WSAStartup(MAKEWORD(2, 0), &wsaData);

					//create master socket
					msock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

					if( msock == INVALID_SOCKET ) {
						EditPrintf(hwndEdit, TEXT("=== Error: create socket error ===\r\n"));
						WSACleanup();
						return TRUE;
					}

					err = WSAAsyncSelect(msock, hwnd, WM_SOCKET_NOTIFY, FD_ACCEPT | FD_CLOSE | FD_READ | FD_WRITE);

					if ( err == SOCKET_ERROR ) {
						EditPrintf(hwndEdit, TEXT("=== Error: select error ===\r\n"));
						closesocket(msock);
						WSACleanup();
						return TRUE;
					}

					//fill the address info about server
					sa.sin_family		= AF_INET;
					sa.sin_port			= htons(SERVER_PORT);
					sa.sin_addr.s_addr	= INADDR_ANY;

					//bind socket
					err = bind(msock, (LPSOCKADDR)&sa, sizeof(struct sockaddr));

					if( err == SOCKET_ERROR ) {
						EditPrintf(hwndEdit, TEXT("=== Error: binding error ===\r\n"));
						WSACleanup();
						return FALSE;
					}

					err = listen(msock, 2);
		
					if( err == SOCKET_ERROR ) {
						EditPrintf(hwndEdit, TEXT("=== Error: listen error ===\r\n"));
						WSACleanup();
						return FALSE;
					}
					else {
						EditPrintf(hwndEdit, TEXT("=== Server START ===\r\n"));
					}

					break;
				case ID_EXIT:
					EndDialog(hwnd, 0);
					break;
			};
			break;

		case WM_CLOSE:
			EndDialog(hwnd, 0);
			break;
		case CGI_SOCKET_NOTIFY:
			switch( WSAGETSELECTEVENT(lParam) )
			{
				case FD_CONNECT:
					break;
				case FD_READ:
					for(i = 0; i < SERVER_NUM; i++)
					{
						if(strlen(server_ip[i]) > 0 && strlen(server_port[i]) > 0 && strlen(file_name[i]) >0)
						{
							if(state[i] == F_READING)
							{
								EditPrintf(hwndEdit, TEXT("reading\n"));
								char read_buf[READ_BUF_SIZE];								char sendb[READ_BUF_SIZE];								int rec;
								rec = recv(client_fd[i], read_buf, READ_BUF_SIZE-1, 0);
								//EditPrintf(hwndEdit, TEXT("%s\n"), read_buf);
								if(rec <= 0)
									;//state[i] = F_WRITING;
								else
								{
									read_buf[rec] = 0;	
									sprintf(sendb, "<script>document.all['m%d'].innerHTML+=\"", i);
									send(ssock, sendb, strlen(sendb), 0);
									int j;									for(j = 0; j < rec-1; j++)									{										if(read_buf[j] == '\n' || read_buf[j] == '\t' || read_buf[j] == '\r')											send(ssock, "<br>", strlen("<br>"), 0);										else											send(ssock, &read_buf[j], 1, 0);									}									send(ssock, "<br>\";</script>\n", strlen("<br>\";</script>\n"), 0);									if(strstr(read_buf, "SHELL#"))									{										//change to WRITINR state										state[i] = F_WRITING;										EditPrintf(hwndEdit, TEXT("SHELL#\n"));										if(state[i] == F_WRITING)
										{
											EditPrintf(hwndEdit, TEXT("write \n"));
											int rec;											char msg_buf[READ_BUF_SIZE];
											char sendb[READ_BUF_SIZE];

											rec = readline(fd[i], msg_buf, READ_BUF_SIZE-1);
											if(rec < 0);
								
											msg_buf[rec-1] = 13;											msg_buf[rec] = 10;											msg_buf[rec+1] = '\0';
											if(strstr(msg_buf, "exit"))
											{
												send(client_fd[i], msg_buf, strlen(msg_buf), 0);
												state[i] = F_DONE;
												
												closesocket(client_fd[i]);
												fclose(fd[i]);
												sprintf(sendb, "<script>document.all['m%d'].innerHTML+=\"<b>", i);
												send(ssock, sendb, strlen(sendb), 0);
												int j;												for(j = 0; j < rec-1; j++)												{													if(msg_buf[j] == '\n' || msg_buf[j] == '\t' || msg_buf[j] == '\r')														send(ssock, "<br>", strlen( "<br>"), 0);													else if(msg_buf[j] == 13);													else														send(ssock, &msg_buf[j], 1, 0);												}												send(ssock, "<br></b>\";</script>\n", strlen("<br></b>\";</script>\n"), 0);
												conn--;
												if(conn == 0)
												{
													send(ssock, "</body>\n", strlen("</body>\n"), 0);													send(ssock, "</html>\n", strlen("</html>\n"), 0);
													closesocket(ssock);
												}
													
											}
											else
											{	
												send(client_fd[i], msg_buf, strlen(msg_buf), 0);	
												/*sprintf(sendb, "<script>document.all['m%d'].innerHTML+=\"<b>", i);
												send(ssock, sendb, strlen(sendb), 0);
												int j;												for(j = 0; j < rec-1; j++)												{													if(msg_buf[j] == '\n' || msg_buf[j] == '\t' || msg_buf[j] == '\r')														send(ssock, "<br>", strlen( "<br>"), 0);													else if(msg_buf[j] == 13);													else														send(ssock, &msg_buf[j], 1, 0);												}												send(ssock, "<br></b>\";</script>\n", strlen("<br></b>\";</script>\n"), 0);*/
												if(strstr(msg_buf, "\n"))
													state[i] = F_READING;
											}
										}									}	
								}
							}
							
						}
					}
					break;
				case FD_WRITE:	
					for(i = 0; i < SERVER_NUM; i++)
					{
						if(strlen(server_ip[i]) > 0 && strlen(server_port[i]) > 0 && strlen(file_name[i]) >0)
						{
						}
					}
					break;
			}
		case WM_SOCKET_NOTIFY:
			switch( WSAGETSELECTEVENT(lParam) )
			{
				case FD_ACCEPT:
					ssock = accept(msock, NULL, NULL);
					Socks.push_back(ssock);
					err = WSAAsyncSelect(ssock, hwnd, WM_SOCKET_NOTIFY, FD_READ | FD_WRITE);
					if ( err == SOCKET_ERROR ) {
						EditPrintf(hwndEdit, TEXT("=== Error: select error ===\r\n"));
						closesocket(ssock);
						WSACleanup();
					}
					EditPrintf(hwndEdit, TEXT("=== Accept one new client(%d), List size:%d ===\r\n"), ssock, Socks.size());
					break;
				case FD_READ:
				//Write your code for read event here.
					char recv_buf[1024];
					char *filename;
					char *query_string;
					int rec;
					FILE * fd;
					rec = recv(ssock, recv_buf, sizeof(recv_buf)-1, 0);
					if(rec <= 0)
						printf("error !! \n");
					else
					{
						strtok(recv_buf, "/");
						filename = strtok(NULL, " ");
						if(strstr(filename, ".cgi"))
						{
							char *query_string;
							send(ssock, "HTTP/1.1 200 OK", strlen("HTTP/1.1 200 OK"), 0);
							send(ssock, "Content-Type: text/html\n\n", strlen("Content-Type: text/html\n\n"), 0);
							strtok(filename, "?");
							query_string = strtok(NULL, " ");
							parse_query_string(query_string);
							open_file(hwndEdit);
							connect_server(hwndEdit, hwnd);
							send_html_header(ssock);
							//closesocket(ssock);
							
						}
						else
						{
							fd = fopen(filename, "r");
							if(fd == NULL)
							{
								//send(ssock, "HTTP/1.1 404 Not Found", strlen("HTTP/1.1 404 Not Found"), 0);
								send(ssock, "HTTP/1.1 200 OK", strlen("HTTP/1.1 200 OK"), 0);
								send(ssock, "Content-Type: text/html\n\n", strlen("Content-Type: text/html\n\n"), 0);
								send(ssock, "<html><body>This is Project 3</body></html>", strlen("<html><body>This is Project 3</body></html>"), 0);
								closesocket(ssock);
								//Socks.pop_back();
							}
							else
							{
								send(ssock, "HTTP/1.1 200 OK", strlen("HTTP/1.1 200 OK"), 0);
								send(ssock, "Content-Type: text/html\n\n", strlen("Content-Type: text/html\n\n"), 0);
								long lSize;
								char * buffer;
								size_t result;
								int ret;

								fseek (fd , 0 , SEEK_END);
								lSize = ftell (fd);
								rewind (fd);
								buffer = (char*) malloc (sizeof(char)*lSize);
								result = fread (buffer,1,lSize,fd);
								//EditPrintf(hwndEdit, TEXT("%s"), buffer);
								ret = send(ssock, buffer, result, 0);
								free(buffer);
								closesocket(ssock);
								Socks.pop_back();

							}
						}

					}
					break;
				case FD_WRITE:
				//Write your code for write event here
					break;
				case FD_CLOSE:
					break;
			};
			break;
		
		default:
			return FALSE;


	};

	return TRUE;
}

int EditPrintf (HWND hwndEdit, TCHAR * szFormat, ...)
{
     TCHAR   szBuffer [1024] ;
     va_list pArgList ;

     va_start (pArgList, szFormat) ;
     wvsprintf (szBuffer, szFormat, pArgList) ;
     va_end (pArgList) ;

     SendMessage (hwndEdit, EM_SETSEL, (WPARAM) -1, (LPARAM) -1) ;
     SendMessage (hwndEdit, EM_REPLACESEL, FALSE, (LPARAM) szBuffer) ;
     SendMessage (hwndEdit, EM_SCROLLCARET, 0, 0) ;
	 return SendMessage(hwndEdit, EM_GETLINECOUNT, 0, 0); 
}

void parse_query_string(char * query_string)
{
	char ip[SERVER_IP_LEN], port[SERVER_PORT_LEN], file[FILE_LEN];	char * token;	int i;	for(i = 0; i < SERVER_NUM; i++)	{		if(i == 0)			token = strtok(query_string, "&");		else			token = strtok(NULL, "&");		sprintf(ip, "h%d=", i+1);		if(!strncmp(token, ip, 3) && strlen(token) > 3)			strncpy(server_ip[i], (token+3), strlen(token+3));		sprintf(port, "p%d=", i+1);		token = strtok(NULL, "&");		if(!strncmp(token, port, 3) && strlen(token) > 3)			strncpy(server_port[i], (token+3), strlen(token+3));		sprintf(file, "f%d=", i+1);		token = strtok(NULL, "&");		if(!strncmp(token, file, 3) && strlen(token) > 3)			strncpy(file_name[i], (token+3), strlen(token+3));			}
}

int readline(FILE *fd, char *ptr, int maxlen){	int n, rc;	char c;	*ptr = 0;	for(n = 1; n < maxlen; n++)	{		if((c = fgetc(fd)) != EOF)		{			*ptr++ = (char)c;			if(c == '\n')	break;		}		else if (c == EOF)		{			if(n == 1)	return 0;			else	break;		}		else			return -1;	}	return n;}void open_file(HWND hwndEdit){	int i;	for(i = 0; i < SERVER_NUM; i++)	{		if(strlen(server_ip[i]) > 0 && strlen(server_port[i]) > 0 && strlen(file_name[i]) >0)			fd[i] = fopen(file_name[i], "r");		if(fd == NULL)			EditPrintf(hwndEdit, TEXT("client_fd[%d] open file error !! \n"), i);	}}void connect_server(HWND hwndEdit, HWND hwnd){	int i;	int err;	int connect_num = 0;	for(i = 0; i < SERVER_NUM; i++)	{		if(strlen(server_ip[i]) > 0 && strlen(server_port[i]) > 0 && strlen(file_name[i]) >0)		{			if ( (client_fd[i] = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET )
				EditPrintf(hwndEdit, TEXT("client_fd[%d] connect server error\n"), i);

			if ( (host=gethostbyname(server_ip[i])) == NULL )
				EditPrintf(hwndEdit, TEXT("gethostbyname error !! \n"));

			address[i].sin_family=AF_INET;
			address[i].sin_port = htons(atoi(server_port[i]));
			address[i].sin_addr.s_addr=*((unsigned long *) host->h_addr);
						err = WSAAsyncSelect(client_fd[i], hwnd, CGI_SOCKET_NOTIFY, FD_CONNECT | FD_CLOSE | FD_READ | FD_WRITE);			if ( err == SOCKET_ERROR ) 
			{
					EditPrintf(hwndEdit, TEXT("=== Error: select error ===\r\n"));
					closesocket(client_fd[i]);
					WSACleanup();
			}			if ( (connect(client_fd[i],(struct sockaddr *) &address[i], sizeof(address[i]))) != 0)
				EditPrintf(hwndEdit, TEXT("connect error !! %d \r\n"), i);			state[i] = F_READING; 			connect_num++;		}	}	conn = connect_num;}void send_html_header(SOCKET ssock){	int i;	char send_buf[1024];	send(ssock, "<html>\n", strlen("<html>\n"), 0);	send(ssock, "<head>\n", strlen("<head>\n"), 0);	send(ssock, "<title>Network Programming HomeWork3 </title>\n", strlen("<title>Network Programming HomeWork3 </title>\n"), 0);	send(ssock, "</head>\n", strlen("</head>\n"), 0);	send(ssock, "<body>\n", strlen("<body>\n"), 0);	send(ssock, "<font face=\"Courier New\" size=4 color=#111111>\n", strlen("<font face=\"Courier New\" size=4 color=#111111>\n"), 0);	send(ssock, "<table width=\"1000\" border=\"1\">\n", strlen("<table width=\"1000\" border=\"1\">\n"), 0);	send(ssock, "<tr>\n", strlen("<tr>\n"), 0);	for(i = 0; i < SERVER_NUM; i++)	{		if(strlen(server_ip[i]) > 0)		{			sprintf(send_buf, "<td> %s </td>", server_ip[i]);			send(ssock, send_buf, strlen(send_buf), 0);		}	}	send(ssock, "</tr>\n", strlen("</tr>\n"), 0);	send(ssock, "<tr>\n", strlen("<tr>\n"), 0);	for(i = 0; i < SERVER_NUM; i++)	{		if(strlen(server_ip[i]) > 0)		{			sprintf(send_buf, "<td valign=\"top\" id=\"m%d\"></td>", i);			send(ssock, send_buf, strlen(send_buf), 0);		}	}	send(ssock, "</tr>\n", strlen("</tr>\n"), 0);	send(ssock, "</table>\n", strlen("</table>\n"), 0);}

⌨️ 快捷键说明

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