2017-07-27 23 views
0

私はtelnetで接続するC++プログラムを作っています。私はサーバーからの出力を取得するため、接続が機能しているようです。問題は、telnetに特定のコマンドを送る必要があることです。たとえば、コマンド:C++ WinSockがTelnetサーバにコマンドを送る

ログインユーザのパスワード

ジャスト()何もしていないようだ(または多分私が何か間違ったことをやっているが、それを見ていないセンド経由で送信します)。 ftp://ftp.rfc-editor.org/in-notes/rfc854.txtのページにいくつかの情報がありますが、私はそれを本当に理解していません。

誰かが私に例を示し、それを動作させるにはどうすればよいのか説明できますか? Googleにしようとしたが、私は本当に私が望むものを正確に見つけられなかった。私は文字通り2つのコマンドを送る必要があります。

は、ここで私は(ない完全なコード)をしようとしているものです:

int main() { 
    int iR; 
    std::string input; 
    std::cout << "Telnet ip: "; 
    std::getline(std::cin, input); 
    std::cout << std::endl; 

    u_long ip = 0; 
    u_short port = DEFAULT_PORT; 
    u_long * ptr = &ip 

    const char * cptr = input.c_str(); 
    inet_pton(AF_INET, cptr, ptr); 

    std::cout << "Telnet port: "; 
    std::getline(std::cin, input); 
    std::cout << std::endl; 
    iR = std::stoi(input); 
    if((iR > SHRT_MAX) || (iR < 0)) { 
    std::cout << "Wrong port number, using default." << std::endl; 
    } 
    else { 
    port = iR; 
    } 

    WSADATA wsaData; 
    iR = WSAStartup(MAKEWORD(2, 2), &wsaData); 
    if (iR != 0) { return 1; } 
    SOCKET server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
    if (server == INVALID_SOCKET) { WSACleanup(); return 1; } 

    sockaddr_in addr; 
    addr.sin_family = AF_INET; 
    addr.sin_addr.s_addr = ip; 
    addr.sin_port = htons(port); 

    std::string user; 
    std::string pass; 
    std::cout << "Username: "; 
    std::getline(std::cin, user); 
    std::cout << std::endl; << "Password: "; 
    std::getline(std::cin, pass); 
    std::cout << std::endl; 

    std::cout << "Connecting..." << std::endl; 
    if ((connect(server, (SOCKADDR *)&addr, sizeof(addr))) == SOCKET_ERROR) { 
    std::cout << "Couldn't connect. << std::endl; 
    WSAcleanup(); 
    Sleep(2000); 
    return 0; 
    } 

    int bRecv = 0; 
    char buff[2048]; 

    bRecv = recv(server, buff, sizeof(buff), 0); 
    if ((bRecv == SOCKET_ERROR) || (bRecv == 0)) { 
    std::cout << "Disconnected from the server." << std::endl; 
    WSACleanup(); 
    return 0; 
    } 

    buff[bRecv] = 0; 
    // When it connects successfully, a message appears on the screen from server 
    std::cout << buff << std::endl; 

    memset(buff, 0, sizeof(buff)); 
    std::string command = "login "; 
    command.append(user); 
    command.append(" "); 
    command.append(pass); 

    cptr = login.c_str(); 
    strcpy_s(buff, cptr); 

    iR = send(server, buff, (u_int)strlen(buff), 0); 
    if (iR == SOCKET_ERROR) { std::cout << "Couldn't send data." << std::endl; WSACleanup(); return 0; 
    while (true) { 
    bRecv = recv(server, buff, sizeof(buff), 0); 
    if ((bRecv == SOCKET_ERROR) || (bRecv === 0)) { 
     std::cout << "Disconnected from the server." << std::endl; 
     break; 
    } 
    buff[bRecv] = 0; 
    std::cout << buff << std::endl; 
    } 
    WSACleanup(); 
    return 0; 
} 

私は間違った方法これをやっていないよ願う意味します。私はC++の初心者です。

+1

を?彼らはGopherサーバーほど絶滅の危機に瀕しています。 – tadman

+3

telnetコマンドは\ r \ nで終わる必要があります。私はあなたがそうしているのを見ない。 – SergeyA

+0

@ tadman ts3 query – GorudoYami

答えて

1

コマンドの後に改行を送信していません。

また、あなたが直接commandを送信することができ、コマンドを保持するためにbuffを使用する必要はありません:あなたは2017年にに接続するためにTelnetサーバを見つけている

iR = send(server, command.c_str(), (u_int) command.length(), 0); 
+0

それは動作します、ありがとうございます。それは簡単だろうとは思わなかった。 – GorudoYami

+0

@GorudoYamiこんにちは。私を固定するのを助けることができますか? Telnetサーバーは私のコマンドを実行しませんhttp://codepad.org/y0m71GEL –

+0

@レミールボーあなたも私を助けることができますか? –

関連する問題