📄 np_hw3.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 + -