Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Telnet服务器不会执行从套接字发送的命令_C++_Sockets_Winapi_Networking_Telnet - Fatal编程技术网

C++ Telnet服务器不会执行从套接字发送的命令

C++ Telnet服务器不会执行从套接字发送的命令,c++,sockets,winapi,networking,telnet,C++,Sockets,Winapi,Networking,Telnet,Hi-im目前正在开发一个向telnet服务器发送命令的程序 这是我的密码: int _tmain(int argc, _TCHAR* argv[]) { WSAData wsaData; WSAStartup(MAKEWORD(2, 2), &wsaData); addrinfo hints; ZeroMemory(&hints, sizeof(hints)); hints.ai_family = AF_INET; hints.a

Hi-im目前正在开发一个向telnet服务器发送命令的程序

这是我的密码:

int _tmain(int argc, _TCHAR* argv[])
{
    WSAData wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);
    addrinfo hints;
    ZeroMemory(&hints, sizeof(hints));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    addrinfo* result;
    int res = getaddrinfo("192.168.56.101", "23", &hints, &result);

    if (res)
    {
        std::cout << "failed to getaddrinfo" << std::endl;
    }

    SOCKET sock = socket(result->ai_family, result->ai_socktype, result->ai_protocol);

    if (connect(sock, result->ai_addr, (int)result->ai_addrlen) != SOCKET_ERROR && sock != INVALID_SOCKET)
    {
        std::cout << "connected";
        char* buf = "md c:\\testfolder\r\n";
        std::cout << send(sock, buf, sizeof("md c:\\testfolder\r\n"), 0);
        const int size = 255;
        char out[size];
        memset(out, 0, size);
        while (true)
        {
            res = recv(sock, out, size, 0);
            std::cout << res << std::endl; // this outputs 21
        }
    }
    else
    {

        std::cout << res;
    }



    std::cin.get();
    return 0;
}
int-tmain(int-argc,_-TCHAR*argv[]
{
WSAData WSAData;
WSAStartup(MAKEWORD(2,2)和wsaData);
addrinfo提示;
零内存(&提示,sizeof(提示));
hits.ai_family=AF_INET;
hits.ai_socktype=SOCK_流;
hits.ai_protocol=IPPROTO_TCP;
addrinfo*结果;
int res=getaddrinfo(“192.168.56.101”、“23”&提示和结果);
如果(res)
{
std::cout ai_socktype,result->ai_协议);
如果(连接(sock,result->ai_addr,(int)result->ai_addrlen)!=SOCKET\u错误和&sock!=无效的\u SOCKET)
{

std::cout您的代码有几个问题。最重要的是,如果
getaddrinfo()
失败,您将进入代码的其余部分,这将崩溃,因为
result
无效。此外,您将忽略
send()
recv()的返回值
。您实际上并没有输出接收到的数据

尝试类似以下内容:

int _tmain(int argc, _TCHAR* argv[])
{
    WSAData wsaData;
    int res = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (res != 0)
    {
        std::cerr << "failed to init Winsock, error " << res << std::endl;
        return 1;
    }

    addrinfo hints;
    ZeroMemory(&hints, sizeof(hints));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    addrinfo* result;

    res = getaddrinfo("192.168.56.101", "23", &hints, &result);
    if (res != 0)
    {
        std::cerr << "failed to getaddrinfo, error " << res << std::endl;
        WSACleanup();
        return 1;
    }

    SOCKET sock = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
    if (sock == INVALID_SOCKET)
    {
        res = WSAGetLastError();
        std::cerr << "failed to create socket, error " << res << std::endl;
        freeaddrinfo(result);
        WSACleanup();
        return 1;
    }

    if (connect(sock, result->ai_addr, (int)result->ai_addrlen) == SOCKET_ERROR)
    {
        res = WSAGetLastError();
        std::cerr << "failed to connect, error " << res << std::endl;
        freeaddrinfo(result);
        closesocket(sock);
        WSACleanup();
        return 1;
    }

    freeaddrinfo(result);
    std::cout << "connected";

    std::string cmd = "md c:\\testfolder\r\n";

    const char *buf = cmd.c_str();
    int size = cmd.length();
    do
    {
        res = send(sock, buf, size, 0);
        if (res == SOCKET_ERROR)
        {
            res = WSAGetLastError();
            std::cerr << "failed to send, error " << res << std::endl;
            closesocket(sock);
            WSACleanup();
            return 1;
        }
        buf += res;
        size -= res;
    }
    while (size > 0);

    char out[255];
    while (true)
    {
        res = recv(sock, out, sizeof(out), 0);
        if (res == SOCKET_ERROR)
        {
            res = WSAGetLastError();
            std::cerr << "failed to recv, error " << res << std::endl;
            closesocket(sock);
            WSACleanup();
            return 1;
        }

        if (res == 0)
        {
            std::cout << "disconnected" << std::endl;
            break;
        }

        std::cout.write(out, res);
    }

    closesocket(sock);
    WSACleanup();

    return 0;
}
int-tmain(int-argc,_-TCHAR*argv[]
{
WSAData WSAData;
int res=WSAStartup(MAKEWORD(2,2)和wsaData);
如果(res!=0)
{

std::cerr首先,归零
out
recv
的返回值是多少?如果没有发生错误,它应该返回字节数received@Asesh返回值是3。@很好,不是3。在我尝试之后,返回值是21,等于缓冲区的大小。是的,我有一个实际的telnet服务器。“实现实际的Telnet协议"?你的意思是我必须创建自己的服务器应用程序,该应用程序将解析和响应客户端发送的命令?这将破坏Telnet的功能。@LorenceHernandez不,你不必创建自己的服务器,你只需要解析和响应你已经连接到的服务器发送给你的内容。不,这不会破坏任何功能Telnet和其他协议一样,是一个实际的协议。它有自己的语法和规则。Telnet不仅仅是发送文本命令。这就是Telnet UI应用程序通过隐藏底层细节欺骗你。