2017-07-27 2 views
0

Je crée donc un programme C++ qui se connecte via telnet. La connexion semble fonctionner, car je reçois la sortie du serveur. Le problème est que j'ai besoin d'envoyer une commande spécifique à telnet. Par exemple, une commande:C++ WinSock envoyant des commandes au serveur telnet

Utilisateur Mot de passe

juste l'envoyer par send() ne semble pas faire quoi que ce soit (ou peut-être que je fais quelque chose de mal, mais ne voient pas). Il y a quelques informations sur la page ftp://ftp.rfc-editor.org/in-notes/rfc854.txt mais je ne le comprends pas vraiment. Est-ce que quelqu'un peut me montrer sur un exemple et expliquer comment je devrais le faire pour le faire fonctionner? J'ai essayé de google mais je n'ai pas vraiment trouvé exactement ce que je veux. J'ai littéralement besoin d'envoyer deux commandes.

Voici ce que j'ai essayé (pas le code complet):

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; 
} 

Je veux dire que j'espère que je ne fais pas ça dans le mauvais sens. Je suis à peu près un débutant en C++.

+1

Où vous trouver un serveur Telnet pour vous connecter à 2017? Ils sont à peu près aussi éteints que les serveurs Gopher. – tadman

+3

Les commandes Telnet doivent se terminer par \ r \ n. Je ne te vois pas faire ça. – SergeyA

+0

@tadman ts3 requête – GorudoYami

Répondre

1

Vous n'envoyez pas de saut de ligne après votre commande.

Vous n'avez pas besoin d'utiliser buff pour maintenir la commande, vous pouvez envoyer directement command:

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

Ça marche, merci. Je ne pensais pas que ce serait aussi simple. – GorudoYami

+0

@GorudoYami salut. pouvez-vous m'aider à réparer le mien? serveur telnet ne va pas exécuter ma commande http://codepad.org/y0m71GEL –

+0

@Remy Lebeau pouvez-vous m'aider aussi? –