C++ WinSock将命令发送到telnet服务器

问题描述:

所以我正在制作一个通过telnet连接的C++程序。连接似乎正在工作,因为我从服务器获得输出。问题是我需要发送一个特定的命令到telnet。例如,一个命令:C++ WinSock将命令发送到telnet服务器

登录用户密码

通过仅发送发送它()似乎并没有做任何事情(或者也许我做错了什么,但看不到它)。 页面上有一些信息ftp://ftp.rfc-editor.org/in-notes/rfc854.txt,但我不太了解它。

有人可以告诉我一个例子,并解释我应该怎么做才能使它工作?试图谷歌,但我并没有真正找到我想要的。我从字面上需要它发送两个命令。

这是我曾尝试(而不是完整的代码):

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

你在哪里找到Telnet服务器连接到2017年?它们和Gopher服务器差不多。 – tadman

+3

telnet命令应该以\ r \ n结尾。我看不到你这样做。 – SergeyA

+0

@tadman ts3查询 – GorudoYami

您的命令后没有发送换行符。

你也不需要使用buff举行的命令,你可以发送command直接:

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

工作,谢谢。没想到会那么简单。 – GorudoYami

+0

@GorudoYami嗨。你能帮我修理我的吗? telnet服务器不会执行我的命令http://codepad.org/y0m71GEL –

+0

@Remy Lebeau你能帮助我吗? –