hongrui86 2024-02-28 21:03 采纳率: 0%
浏览 5

C++引入头文件后提示未找到相应标识符

刚入手C++,以下是网上复制的代码,目的是为了连接SFTP,为什么在我的visual studio运行就提示"strncasecmp"和"write"两个标识符未找到呢,仅有这两个错误,已经引入string.h了啊,网上推荐的预编译打开或者关闭的方法试过也不好使,求指点

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <libssh/libssh.h>
using namespace std;
int verify_knownhost(ssh_session session);
char* getpass(const char* str);
int show_remote_processes(ssh_session session);

int main()
{
    ssh_session my_ssh_session;
    int port = 22;
    int rc;
    char* password;

    /*创建一个会话*/
    my_ssh_session = ssh_new();
    if (my_ssh_session == NULL)
    {
        exit(-1);
    }

    /*设置会话相关信息*/
    ssh_options_set(my_ssh_session, SSH_OPTIONS_HOST, "localhost");
    //ssh_options_set(my_ssh_session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity);
    ssh_options_set(my_ssh_session, SSH_OPTIONS_PORT, &port);
    ssh_options_set(my_ssh_session, SSH_OPTIONS_USER, "freetype");

    /*连接到服务器*/
    rc = ssh_connect(my_ssh_session);
    if (rc != SSH_OK)
    {
        fprintf(stderr, "Error connecting to localhost: %s\n", ssh_get_error(my_ssh_session));
        ssh_free(my_ssh_session);
        exit(-1);
    }

    /*其它认证方式*/
    /*if(verify_knownhost(my_ssh_session) < 0)
    {
            ssh_disconnect(my_ssh_session);
            ssh_free(my_ssh_session);
            exit(-1);
    }*/

    /*密码认证方式*/
    password = getpass("Password: ");
    rc = ssh_userauth_password(my_ssh_session, NULL, password);
    if (rc != SSH_AUTH_SUCCESS)
    {
        fprintf(stderr, "Error authenticating with password: %s\n", ssh_get_error(my_ssh_session));
        ssh_disconnect(my_ssh_session);
        ssh_free(my_ssh_session);
        exit(-1);
    }

    fprintf(stderr, "connect success!\n");
    show_remote_processes(my_ssh_session);

    ssh_disconnect(my_ssh_session);
    ssh_free(my_ssh_session);

    exit(0);
}

char* getpass(const char* str)
{
    static char password[64];
    int index;

    fprintf(stdout, "%s", str);

    if (fgets(password, sizeof(password), stdin) == NULL)
    {
        fprintf(stderr, "fgets error\n");
        return NULL;
    }

    index = strlen(password) - 1;

    if (password[index] == '\n')
    {
        password[index] = '\0';
    }

    return password;
}

/*服务器认证方式*/
int verify_knownhost(ssh_session session)
{
    int state;
    int hlen;
    unsigned char* hash = NULL;
    char* hexa;
    char buf[10];

    state = ssh_is_server_known(session);

    hlen = ssh_get_pubkey_hash(session, &hash);
    if (hlen < 0)
    {
        free(hash);
        return -1;
    }

    switch (state)
    {
    case SSH_SERVER_KNOWN_OK:
        break;

    case SSH_SERVER_KNOWN_CHANGED:
        fprintf(stderr, "Host key for server changed: it is now:\n");
        ssh_print_hexa("Public key hash", hash, hlen);
        fprintf(stderr, "For security reasons, connection will be stopped\n");
        free(hash);
        return -1;

    case SSH_SERVER_FOUND_OTHER:
        fprintf(stderr, "The host key for this server was not found but an other type of key exists.\n");
        fprintf(stderr, "An attacker might change the default server key to confuse your client into thinking the key does not exist\n");
        free(hash);
        return -1;

    case SSH_SERVER_FILE_NOT_FOUND:
        fprintf(stderr, "Could not find known host file.\n");
        fprintf(stderr, "If you accept the host key here, the file will be automatically created.\n");

    case SSH_SERVER_NOT_KNOWN:
        hexa = ssh_get_hexa(hash, hlen);
        fprintf(stderr, "The server is unknown. Do you trust the host key?\n");
        fprintf(stderr, "Public key hash: %s\n", hexa);
        free(hexa);

        if (fgets(buf, sizeof(buf), stdin) == NULL)
        {
            free(hash);
            return -1;
        }

        if (strncasecmp(buf, "yes", 3) != 0)
        {
            free(hash);
            return -1;
        }

        if (ssh_write_knownhost(session) < 0)
        {
            fprintf(stderr, "Error %s\n", strerror(errno));
            free(hash);
            return -1;
        }

        break;

    case SSH_SERVER_ERROR:
        fprintf(stderr, "Error %s", ssh_get_error(session));
        free(hash);
        return -1;
    }

    free(hash);

    return 0;
}

int show_remote_processes(ssh_session session)
{
    ssh_channel channel;
    int rc;
    char buffer[256];
    int nbytes;

    channel = ssh_channel_new(session);
    if (channel == NULL)
    {
        return SSH_ERROR;
    }

    rc = ssh_channel_open_session(channel);
    if (rc != SSH_OK)
    {
        ssh_channel_free(channel);
        return rc;
    }

    rc = ssh_channel_request_exec(channel, "pwd");
    if (rc != SSH_OK)
    {
        ssh_channel_close(channel);
        ssh_channel_free(channel);
        return rc;
    }

    nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);
    while (nbytes > 0)
    {
        if (write(1, buffer, nbytes) != (unsigned int)nbytes)
        {
            ssh_channel_close(channel);
            ssh_channel_free(channel);
            return SSH_ERROR;
        }

        nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);
    }

    if (nbytes < 0)
    {
        ssh_channel_close(channel);
        ssh_channel_free(channel);
        return SSH_ERROR;
    }

    ssh_channel_send_eof(channel);
    ssh_channel_close(channel);
    ssh_channel_free(channel);

    return SSH_OK;
}

  • 写回答

2条回答 默认 最新

  • 关注

    hongrui86 晚上好🌙🌙🌙
    本答案参考通义千问

    你遇到的问题是strncasecmpwrite函数在你的编译器环境下可能没有被正确地包含。尽管<string.h>头文件通常包含了strncasecmp,但write函数在C++标准库中并不常见,它更常在unistd.hstdio.h中找到。为了解决这个问题,你可以尝试以下步骤:

    1. 检查头文件: 确保你在使用write函数时,正确地包含了unistd.h头文件,如下所示:

      #include <unistd.h>
      
    2. 添加缺失的库链接: 如果unistd.h仍然无法解决write函数的问题,可能是因为你需要链接unistd库。在Visual Studio中,确保在项目属性的链接器设置中包含了crtw32.liblibcmt.lib(取决于你的编译器版本)。

    3. 更新代码: 将write函数替换为C++标准库中的fwrite,或者使用std::fwrite(如果已经包含了cstdio):

      if (fwrite(buffer, 1, nbytes, stdout) != (size_t)nbytes)
      {
          // 错误处理
      }
      
    4. 检查编译选项: 确保你的编译器选项正确,比如 -std=c++11 或更高,以确保正确支持C++11标准。

    5. 清理缓存: 清理Visual Studio的项目缓存或者重新构建项目,有时候编译器缓存可能会导致问题。

    6. 查看编译错误: 如果上述步骤都无法解决问题,仔细检查编译器输出的错误信息,它可能会提供关于问题的具体原因。

    如果你是在尝试连接到远程SFTP服务器,可能还需要检查libssh库的配置和安装,确保库文件路径正确,并且库已经被正确链接到你的程序中。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月28日

悬赏问题

  • ¥15 WPF动态创建页面内容
  • ¥15 如何对TBSS的结果进行统计学的分析已完成置换检验,如何在最终的TBSS输出结果提取除具体值及如何做进一步相关性分析
  • ¥15 SQL数据库操作问题
  • ¥100 关于lm339比较电路出现的问题
  • ¥15 Matlab安装yalmip和cplex功能安装失败
  • ¥15 加装宝马安卓中控改变开机画面
  • ¥15 STK安装问题问问大家,这种情况应该怎么办
  • ¥15 关于罗技鼠标宏lua文件的问题
  • ¥15 halcon ocr mlp 识别问题
  • ¥15 已知曲线满足正余弦函数,根据其峰值,还原出整条曲线