Здрасте. Помогите пожалуйсто. У меня клиент-серверное приложение. Сервер создаёт процес с запуском консоли и через пайпы получает вывод.Но у меня не работает через пересылку по сети, а если я буду читать в пайп локально (сразу писать в программе комманду в буффер а не через сеть) то работает. Посмотрите плиз код сервера (кусок процеДУРЫ). procedure RunRemoteShell(ClientSocket: TSocket); var SecurityAttributes: TSecurityAttributes; ProcessInfo: TProcessInformation; StartUpInfo: TStartupInfo; StdPipeOutRead: THandle; StdPipeOutWrite: THandle; StdPipeInRead: THandle; StdPipeInWrite: THandle; WasOK: Boolean; Buffer: array[0..1024] of Char; Buffer2: array[0..1024] of Char; BytesRead: Cardinal; BytesAvail: Cardinal; len: integer; WorkDir, Line: string; begin SecurityAttributes.nLength:=SizeOf(TStartUpInfo); SecurityAttributes.bInheritHandle:=True; SecurityAttributes.lpSecurityDescriptor:=nil; CreatePipe(StdPipeOutRead,StdPipeOutWrite,@SecurityAttributes,0); CreatePipe(StdPipeInRead,StdPipeInWrite,@SecurityAttributes,0); ZeroMemory(@StartUpInfo,SizeOf(TStartUpInfo)); StartUpInfo.cb:=SizeOf(TStartUpInfo); StartUpInfo.dwFlags:=STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; StartUpInfo.hStdInput:=StdPipeInRead; StartUpInfo.hStdOutput:=StdPipeOutWrite; StartUpInfo.hStdError:=StdPipeOutWrite; WasOK:=CreateProcess('C:\Windows\System32\cmd.exe',nil,nil,nil,True,CREATE_NEW_CONSOLE,nil,nil,StartUpInfo,ProcessInfo); while True do begin ZeroMemory(@Buffer,SizeOf(Buffer)); ZeroMemory(@Buffer2,SizeOf(Buffer2)); PeekNamedPipe(StdPipeOutRead,@Buffer,1023,@BytesRead,@BytesRead,nil); if BytesRead <> 0 then begin ReadFile(StdPipeOutRead,Buffer,SizeOf(Buffer),BytesRead,nil); Buffer[BytesRead]:=#13; Buffer[BytesRead+1]:=#10; send(ClientSocket,Buffer,SizeOf(Buffer),0); end else begin recv(ClientSocket,Buffer2,SizeOf(Buffer2),0); WriteFile(StdPipeInWrite,Buffer2,SizeOf(Buffer2),BytesRead,nil); end; end; end; А вот код клиента program Client; {$APPTYPE CONSOLE} uses Windows, WinSock; const Port: Integer = 82; var WSAData: TWSAData; ClientSocket: TSocket; ClientAddr: TSockAddrIn; Status: Integer; BufferRead: Array[0..1024] of Char; BufferWrite: Array[0..1024] of Char; len: integer; function WSASocketA(af, wType, protocol: Integer; IpProtocolInfo: Pointer; g, dwFlags: DWORD): Integer; stdcall; external 'ws2_32.dll'; begin Status:=WSAStartup($0202,WSAData); ClientSocket:=WSASocketA(AF_INET,SOCK_STREAM,IPPROTO_TCP,nil,0,0); ClientAddr.sin_family:=AF_INET; ClientAddr.sin_port:=htons(Port); ClientAddr.sin_addr.S_addr:=inet_addr('127.0.0.1'); Status:=connect(ClientSocket,ClientAddr,SizeOf(ClientAddr)); if Status = 0 then while True do begin recv(ClientSocket,BufferRead,SizeOf(BufferRead),0); Write(BufferRead); Readln(BufferWrite); len:=Length(BufferWrite); BufferWrite[len]:=#13; BufferWrite[len+1]:=#10; send(ClientSocket,BufferWrite,SizeOf(BufferWrite),0); end; Read(BufferWrite); end. Помогите плиз, что нет так((((((( умаляю. И ещё вопрос. Читал на античате что вывод консоли можно получить легче, вот так. Глянте другую процедуру. procedure RunRemoteShell2(ClientSocket: TSocket); var StartUpInfo: TStartupInfo; ProcessInfo: TProcessInformation; begin ZeroMemory(@StartUpInfo,SizeOf(TStartUpInfo)); StartUpInfo.cb:=SizeOf(TStartUpInfo); StartUpInfo.dwFlags:=STARTF_USESTDHANDLES; StartUpInfo.wShowWindow:=SW_NORMAL; StartUpInfo.hStdInput:=ClientSocket; StartUpInfo.hStdOutput:=ClientSocket; StartUpInfo.hStdError:=ClientSocket; CreateProcess('C:\Windows\System32\cmd.exe',nil,nil,nil,True,0,nil,nil,StartUpInfo,ProcessInfo); end; Она прикрасно работает, если с ней работать через прогу telnet (telnet 127.0.0.1 82) Но када я пишу к ней свой клиент, то клиет виснет на первой команде, и нехера не пашет((( просвятите плиз)
вот код процеДУРЫ, которая запускает консольное приложение и возвращает, либо его вывод в удобочитаемом формате (OemToCharBuf), либо текстовое представление кода ошибки. Первые dword результата, это размер текстовых данных (для последующего send), далее собственно текст. Надеюсь поможет разобраться. Код (Text): Exec proc pcmd:dword local pi:PROCESS_INFORMATION local _si:STARTUPINFO local hRead:dword local hWrite:dword local sat:SECURITY_ATTRIBUTES local cbr:dword local resbuf:dword invoke VirtualAlloc,0,0FFFFh,MEM_COMMIT,PAGE_READWRITE mov resbuf,eax mov sat.nLength,sizeof SECURITY_ATTRIBUTES mov sat.lpSecurityDescriptor,0 mov sat.bInheritHandle,TRUE invoke CreatePipe,addr hRead,addr hWrite,addr sat,0 mov _si.cb,sizeof STARTUPINFO invoke GetStartupInfo,addr _si mov _si.wShowWindow,SW_HIDE mov _si.dwFlags,STARTF_USESHOWWINDOW+STARTF_USESTDHANDLES mov eax,hWrite mov _si.hStdOutput,eax mov _si.hStdError,eax invoke CreateProcess,0,pcmd,0,0,TRUE,0,0,0,addr _si,addr pi test eax,eax jz @f invoke WaitForSingleObject,pi.hProcess,20000 cmp eax,0 jz ok invoke SetLastError,STATUS_TIMEOUT jmp @f ok: mov edi,resbuf add edi,4 invoke ReadFile,hRead,edi,0FFFFh-4,addr cbr,0 mov ecx,cbr inc ecx mov [edi-4],ecx invoke OemToCharBuff,edi,edi,cbr jmp exit @@: call GetLastError mov edi,resbuf add edi,4 invoke FormatMessage,FORMAT_MESSAGE_FROM_SYSTEM,0,eax,0,edi,0FFFFh,0 inc eax mov [edi-4],eax exit: invoke CloseHandle,hWrite invoke CloseHandle,hRead mov eax,resbuf ret Exec endp