experiment : create a server, wait telnet to connect
发布日期:2021-06-30 22:04:08 浏览次数:2 分类:技术文章

本文共 7494 字,大约阅读时间需要 24 分钟。

/// @file       prj51.cpp/// @brief      experiment : create a server, wait telnet to connect///             win7x64sp1 + vs2010 + MBCS#include "stdafx.h"#include 
#include
#pragma comment(lib,"Ws2_32") #include
#include
#define CMD_PROG "cmd.exe"#define PORT_LISTEN 9999void SetParam(int argc, char* argv[], int & iPort, char * pCmdLine);void SocketInit();void SocketGen(SOCKET & listenFD);void SocketBind(SOCKET & listenFD, int iPort, struct sockaddr_in & server);void SocketListen(SOCKET & listenFD);void SocketAccept( SOCKET & listenFD, struct sockaddr_in & server, SOCKET & clientFD);void CreatePipeEx(HANDLE & hRead, HANDLE & hWrite);void CreateProcessEx( char * cmdLine, HANDLE hStdInput, HANDLE hStdOutput, HANDLE hStdError);void SocketUnInit();void SocketProcess( SOCKET & clientFD, HANDLE & hReadPipe1, HANDLE & hWritePipe2);/// MBCS工程/// usage : prj51.exe 55555 cmd.exe/// 在telnet 上输入命令后回车, 需要再输入一个回车, 命令才被执行int main(int argc, char* argv[]){ int iPort = 0; SOCKET listenFD = INVALID_SOCKET; HANDLE hReadPipe1 = INVALID_HANDLE_VALUE; HANDLE hWritePipe1 = INVALID_HANDLE_VALUE; HANDLE hReadPipe2 = INVALID_HANDLE_VALUE; HANDLE hWritePipe2 = INVALID_HANDLE_VALUE; char cmdLine[MAX_PATH] = {0}; SOCKET clientFD = INVALID_SOCKET; struct sockaddr_in server; ::ZeroMemory(&server, sizeof(sockaddr_in)); /// if error happen , see screen log SetParam(argc, argv, iPort, cmdLine); SocketInit(); SocketGen(listenFD); SocketBind(listenFD, iPort, server); SocketListen(listenFD); SocketAccept(listenFD, server, clientFD); CreatePipeEx(hReadPipe1, hWritePipe1); CreatePipeEx(hReadPipe2, hWritePipe2); CreateProcessEx(cmdLine, hReadPipe2, hWritePipe1, hWritePipe1); /// socket process SocketProcess(clientFD, hReadPipe1, hWritePipe2); SocketUnInit(); printf("END, press any key to quit\n"); getchar(); return 0;}void SetParam(int argc, char* argv[], int & iPort, char * pCmdLine){ if (argc >= 2) iPort = _ttoi(argv[1]); else iPort = PORT_LISTEN; if (argc >= 3) _tcscpy(pCmdLine, argv[2]); else _tcscpy(pCmdLine, CMD_PROG); _tprintf("iPort = %d\r\npCmdLine = %s\r\n", iPort, pCmdLine);}void SocketInit(){ int iRc = 0; WSADATA wsa; iRc = WSAStartup(MAKEWORD(2,2), &wsa); printf("WSAStartup = %d, %s\r\n", iRc, (0 == iRc) ? "OK" : "ERR");}void SocketGen(SOCKET & listenFD){ listenFD = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); printf("socket = %d, %s\r\n", listenFD, (INVALID_SOCKET != listenFD) ? "OK" : "ERR");}void SocketBind(SOCKET & listenFD, int iPort, struct sockaddr_in & server){ int iRc = 0; server.sin_family = AF_INET; server.sin_port = htons(iPort); server.sin_addr.s_addr=ADDR_ANY; iRc = bind(listenFD, (sockaddr *)&server, sizeof(sockaddr_in)); printf("bind = %d, %s\r\n", iRc, (SOCKET_ERROR != iRc) ? "TRUE" : "FALSE");}void SocketListen(SOCKET & listenFD){ int iRc = 0; iRc = listen(listenFD, SOMAXCONN); printf("listen = %d, %s\r\n", iRc, (SOCKET_ERROR != iRc) ? "TRUE" : "FALSE");}void SocketAccept( SOCKET & listenFD, struct sockaddr_in & server, SOCKET & clientFD){ int iAddrSize = sizeof(sockaddr_in); printf("accept...\r\n"); clientFD = accept(listenFD, (sockaddr *)&server, &iAddrSize); printf("clientFD = %d, %s\r\n", clientFD, (INVALID_SOCKET != clientFD) ? "TRUE" : "FALSE");}void CreatePipeEx(HANDLE & hRead, HANDLE & hWrite){ BOOL bRc = FALSE; SECURITY_ATTRIBUTES sa; sa.nLength = 12; sa.lpSecurityDescriptor = 0; sa.bInheritHandle = TRUE; bRc = CreatePipe(&hRead, &hWrite, &sa, 0); printf("CreatePipe = %s\r\n", bRc ? "TRUE" : "FALSE");}void CreateProcessEx( char * cmdLine, HANDLE hStdInput, HANDLE hStdOutput, HANDLE hStdError){ BOOL bRc = FALSE; STARTUPINFO si; PROCESS_INFORMATION ProcessInformation; ZeroMemory(&si, sizeof(STARTUPINFO)); si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES; si.wShowWindow = SW_HIDE; si.hStdInput = hStdInput; si.hStdOutput = hStdOutput; si.hStdError = hStdError; bRc = CreateProcess( NULL, cmdLine, NULL, NULL, TRUE, 0, NULL, NULL, &si, &ProcessInformation); printf("CreateProcess 2 = %s\r\n", bRc ? "TRUE" : "FALSE");}void SocketUnInit(){ WSACleanup();}void SocketProcess(SOCKET & clientFD, HANDLE & hReadPipe1, HANDLE & hWritePipe2){ BOOL bRc = FALSE; int iRc = 0; char BuffTotal[1024 * 60]; ///< 累计后的整个输入缓冲区 char Buff[1024 * 60]; char cTailDec0 = '\0'; ///< 倒数第1个字符 char cTailDec1 = '\0'; ///< 倒数第2个字符 DWORD dwRead = 0; int iLenCmdTotal = 0; ///< 要在服务器端执行的命令总长度 ZeroMemory(BuffTotal, sizeof(BuffTotal)); while (1) { ::ZeroMemory(Buff, sizeof(Buff)); bRc = PeekNamedPipe( hReadPipe1, Buff, sizeof(Buff), &dwRead, 0, 0); printf("PeekNamedPipe = %s, lBytesRead = %d\r\n", bRc ? "TRUE" : "FALSE", dwRead); if (dwRead > 0) { printf("ReadFile ...\r\n"); bRc = ReadFile(hReadPipe1, Buff, dwRead, &dwRead, 0); if(!bRc) { printf("ReadFile = FALSE\r\n"); break; } printf("lBytesRead = %d, Buff = %s\r\n", dwRead, Buff); iRc = send(clientFD, Buff, dwRead, 0); printf("send = %s \r\n", (iRc == (int)dwRead) ? "TRUE" : "FALSE"); if (iRc <= 0) { printf("ret<=0, break\r\n"); break; } } else { printf("recv ...\r\n"); dwRead = recv(clientFD, Buff, sizeof(Buff), 0); if (dwRead <= 0) { printf("lBytesRead<=0\r\n"); break; } printf("recv : Buff = %s\r\n", Buff); strcat(BuffTotal, Buff); iLenCmdTotal = strlen(BuffTotal); if (iLenCmdTotal > 2) { cTailDec0 = *(BuffTotal + strlen(BuffTotal) - 1); cTailDec1 = *(BuffTotal + strlen(BuffTotal) - 2); if ((cTailDec1 == '\r') && (cTailDec0 == '\n')) { /// 如果结束字符为回车, 再发送 /// 再人工加一个回车, 模拟必须再次回车才能执行命令的情况 /// 试验证明, 必须要在telnet上输入一个回车, 命令才会被执行... /// 在这加回车没用... strcat(BuffTotal, "\r\n\r\n"); printf(">> WriteFile, lBytesRead = %d ...\r\n", dwRead); bRc = WriteFile( hWritePipe2, BuffTotal, strlen(BuffTotal), &dwRead, 0); ::ZeroMemory(BuffTotal, sizeof(BuffTotal)); printf("<< WriteFile, lBytesRead = %d ...\r\n", dwRead); if(!bRc) { printf("ret = FALSE, break\r\n"); break; } } } } }}

转载地址:https://lostspeed.blog.csdn.net/article/details/12900677 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:(ZT) setting a break in windbg when windows message queue have message which like WM_LBUTTONDOWN
下一篇:experiment : DeviceIoControl调用流程

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年04月11日 06时24分04秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章