2015-01-29 8 views
3

지금까지 코드 명령처럼 : 여기 스크린 샷에서 볼 수 있듯이netcat을 다시 전송하지 않습니다 델파이에서 프로그램을 듣는 것은 내가 여기 윈속 를 사용하여 포트 8080을 청취 델파이 프로그램이

program Project1; 

{$APPTYPE CONSOLE} 

uses 
    Windows, 
    SysUtils, 
    WinSock; 

var 
    WSAData: TWSAData; 
    ServerSocket,ClientSocket: TSocket; 
    ServerAddr, ClientAddr: TSockAddr; 
    ClientAddrSize,Status,ret: Integer; 
    Buffer1,buffer2: array[0..1024] of Char; 

begin 
    writeln('started..'); 
    WSAStartup($0101,WSAData); 
    ServerSocket:=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
    ServerAddr.sin_family:=AF_INET; 
    ServerAddr.sin_port:=htons(8080); 
    ServerAddr.sin_addr.S_addr:=INADDR_ANY; 
    bind(ServerSocket,ServerAddr,SizeOf(ServerAddr)); 
    listen(ServerSocket,10); 
    ClientAddrSize:=SizeOf(ClientAddr); 
    ClientSocket:=accept(ServerSocket,@ClientAddr,@ClientAddrSize); 
    if ClientSocket <> INVALID_SOCKET then 
    begin 
    while True do 
    begin 
    ret:=recv(ClientSocket,Buffer2,SizeOf(Buffer2),0); 
    Writeln(Buffer2); 
    Readln(Input, Buffer1); 
    ret:=send(ClientSocket,Buffer1,SizeOf(Buffer1),0); 
    end; 
    end; 

end. 

: enter image description here

내가 netcat을 열고 내 프로그램은 원격 명령 셸을 엽니 다 을 "NC 127.0.0.1 8080 -e cmd.exe를"을 사용하여 연결합니다. 내가

Readln(Input, Buffer1); 

모든 아이디어는 이후에 명령을 보내더라도,

내 프로그램은 명령 프롬프트를 열 때 일반적으로 볼 수있는 첫 번째 라인을 얻을 수 있지만, 나중에 내가 "디렉토리"와 같은 명령을 실행할 수없는 이유는 무엇입니까?

EDIT : "dir"명령은 "C : \>"아래에 작성되었습니다. netcat처럼해야 할 필요가 있습니다. 아마도 명령에 대한 파이프를 만들어야합니다.

+0

netcat' 작동하지만, 당신은 라인을 보내는 확인을 얼마나'확실하지 각 명령의 종료 문자는 무엇입니까? –

+0

흠, 당신은 vaild 포인트가, 나는 테스트를 만들거야. – Ira

+0

그게 내가 명령을 보내는 각 Buffer1의 끝에 문자 # 13 # 10을 추가하면 그랬다. – Ira

답변

0

어떤 이유로 든 첫 번째 명령을 다시 에코하고 나머지 명령은 실행하기 위해 두 번 입력해야하기 때문에 이것은 지금까지 절대적으로 올바르지 않습니다.

program Project1; 

{$APPTYPE CONSOLE} 

uses 
    Windows, 
    SysUtils, 
    WinSock, 
    uSockFunc in 'uSockFunc.pas'; 

var 
    WSAData: TWSAData; 
    ServerSocket,ClientSocket: TSocket; 
    ServerAddr, ClientAddr: TSockAddr; 
    ClientAddrSize: Integer; 
    Buffer1, buffer2 : string; 

begin 
    writeln('started..'); 
    WSAStartup($101,WSAData); 
    ServerSocket:=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
    ServerAddr.sin_family:=AF_INET; 
    ServerAddr.sin_port:=htons(8080); 
    ServerAddr.sin_addr.S_addr:=INADDR_ANY; 
    bind(ServerSocket,ServerAddr,SizeOf(ServerAddr)); 
    listen(ServerSocket,10); 
    ClientAddrSize:=SizeOf(ClientAddr); 
    ClientSocket:=accept(ServerSocket,@ClientAddr,@ClientAddrSize); 
    if ClientSocket <> INVALID_SOCKET then 
    begin 
    while True do 
    begin 

    Buffer2 := RecvLn(ClientSocket, #$A); 
    Writeln(Buffer2); 
    Buffer2 := ''; 

    Readln(Input, Buffer1); 
    SendString(ClientSocket, Buffer1 + #13#10); 
    Buffer1 := ''; 

    end; 
    end; 

end. 

나는 또한 "SendString"와 "RecvLn"기능에 대한 나의 아닌 본 기기를 사용 :

unit uSockFunc; 

interface 
uses windows, winsock; 
const 
EOL = #13#10; 
function Connect(address : String; port : Integer) : Integer; 
procedure Disconnect(sinsock : TSocket); 
function SendBuf(s : TSocket; var Buffer; Len : Integer) : Integer; 
function SendString(s : TSocket; str : String) : Integer; 
function RecvLn(s : TSocket; Delim: String = EOL): String; 
function RecvLen(s : TSocket) : Integer; 
function RecvBuf(s : TSocket; var Buffer; Len : Integer) : Integer; 
implementation 

function Connect(address : String; port : Integer) : Integer; 
var 
    sinsock   : TSocket; 
    SockAddrIn  : TSockAddrIn; 
    hostent   : PHostEnt; 
begin 
    sinsock := Winsock.socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); 
    SockAddrIn.sin_family := AF_INET; 
    SockAddrIn.sin_port := htons(Port); 
    SockAddrIn.sin_addr.s_addr := inet_addr(pchar(address)); 
    if SockAddrIn.sin_addr.s_addr = INADDR_NONE then 
    begin 
    HostEnt := gethostbyname(pchar(Address)); 
    if HostEnt = nil then 
    begin 
     result := SOCKET_ERROR; 
     Exit; 
    end; 
    SockAddrIn.sin_addr.s_addr := Longint(PLongint(HostEnt^.h_addr_list^)^); 
    end;       //CHANGE MADE 
    if Winsock.Connect(sinSock, SockAddrIn, SizeOf(SockAddrIn)) = SOCKET_ERROR Then 
    result := SOCKET_ERROR 
    else 
    result := sinsock; 
end; 

function SendBuf(s : TSocket; var Buffer; Len : Integer) : Integer; 
begin 
    Result := send(s, Buffer, Len, 0); 
end; 

function SendString(s : TSocket; str : String) : Integer; 
begin 
    result := SendBuf(s, str[1],Length(str)); 
end; 

function RecvLn(s : TSocket; Delim: String = EOL): String; 
const 
    BUFFER_SIZE = 255; 
var 
    Buffer: String; 
    I, L: Cardinal; 
begin 
    Result := ''; 
    I := 1; 
    L := 1; 
    SetLength(Buffer, BUFFER_SIZE); 
    while (L <= Cardinal(Length(Delim))) do 
    begin 
    if recv(s, Buffer[I], 1, 0) < 1 then Exit; 
     /// 
    if Buffer[I] = Delim[L] then 
     Inc(L) 
    else 
     L := 1; 
    Inc(I); 
    if I > BUFFER_SIZE then 
    begin 
     Result := Result + Buffer; 
     I := 1; 
    end; 
    end; 
    Result := Result + Copy(Buffer, 0, I - L); 
end; 

function RecvLen(s : TSocket) : Integer; 
begin 
    if ioctlsocket(s, FIONREAD, Longint(Result)) = SOCKET_ERROR then 
    begin 
    Result := SOCKET_ERROR; 
    end; 
end; 

function RecvBuf(s : TSocket; var Buffer; Len : Integer) : Integer; 
begin 
    Result := recv(s, Buffer, Len, 0); 
    if (Result = SOCKET_ERROR) and (WSAGetLastError = WSAEWOULDBLOCK) then 
    begin 
    Result := 0; 
    end; 
end; 

procedure Disconnect(sinsock : TSocket); 
begin 
    closesocket(sinsock); 
end; 
end.