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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2024年04月11日 06时24分04秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
彻底卸载MySQL
2019-05-01
Oracle创建表,修改表(添加列、修改列、删除列、修改表的名称以及修改列名)
2019-05-01
SQL命令分类(DDL、DML、DCL、TCL以及事务)
2019-05-01
nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate 报错
2019-05-01
kafka集群搭建
2019-05-01
Python正则表达式,从入门到实战,精华都在这里!
2019-05-01
喜欢玩王者荣耀的有福了,用 Python 获取英雄皮肤壁纸
2019-05-01
一名数据分析师的SQL学习历程
2019-05-01
图解《金字塔原理》,7步掌握其精华!
2019-05-01
数据分析入门选择Python还是SQL?七个常用操作对比!
2019-05-01
最后一台,i7+6核电脑
2019-05-01
19款国产手机无一幸免:15分钟破解人脸识别,打印眼镜让刷脸形同虚设
2019-05-01
通俗讲解深度学习中的图像分割技术
2019-05-01
Github标星4.8K!微软开源的可视化工具,未免太酷炫了吧
2019-05-01
这可能是近 2 年进腾讯的最好机会!
2019-05-01
比正则快M倍以上!Python替换字符串的新姿势
2019-05-01
用SVM来识别魔方颜色(实践篇)
2019-05-01
期待已久的微信功能,终于要来了!
2019-05-01
手把手教你搭建计算机视觉开发环境
2019-05-01
超级详细,“保姆级”Python优质学习攻略来啦!
2019-05-01