【问题标题】:c getprotobyname getting protocols informationc getprotobyname 获取协议信息
【发布时间】:2014-11-23 17:36:27
【问题描述】:

我刚开始学习 C 编程,为了练习,我找到了这个任务。首先,我必须以协议的名义进行扫描。然后我必须检查协议的正式名称、编号和别名。因此,如果我输入 tcp,输出将如下所示:
正式名称:tcp
原型编号:6
别名 TCP

这是我到目前为止所得到的。当我运行它并输入 ip 或 tcp 时,它不会给我任何错误。但它说没有找到协议。

提前感谢您的帮助。

#include <netdb.h>
#include <stdio.h>


int main(){
    char  name[200];
    int i;

    struct protoent *proto = getprotobyname(name);

    printf("Enter protocol name: ");        
    scanf("%c", name);

    proto = getprotobyname( name );  


    if ( proto != NULL )
    {
        printf("official name: %s\n", proto->p_name);

        printf("proto number: %d\n", proto->p_proto);

        for ( i = 0; proto->p_aliases[i] != 0; i++ ){
                 printf("alias: %s\n", proto->p_aliases[i]);
            }
    }
    else{
        perror("protocol not found");
    }


        return 0;
}

【问题讨论】:

  • Bug 1:getprotobyname(name); 被调用了两次,一次在name 初始化之前,第二次在它之后。Bug 2:scanf("%c", name); 必须是scanf("%s", name);

标签: c network-programming


【解决方案1】:

这是错误:scanf("%c", name);

通过使用%c 将格式说明符传递给scanf,您只是在读取一个字符。使用此getprotobyname() 返回无效,因此您会看到打印protocol not found

相反,您需要使用 %s 从标准输入读取整个字符串。

【讨论】:

  • 非常感谢您的回答。这对我帮助很大。
【解决方案2】:
 char  name[200];
 int i;
 struct protoent *proto = getprotobyname(name);

这里使用了name,之后您阅读了name

 scanf("%c", name);

这也是读取char数组的错误。需要 %s 格式说明符才能读取 char 数组。所以应该是

 scanf("%s", name);

你的代码应该是

int main(){
    char  name[200];
    int i;

    struct protoent *proto;

    printf("Enter protocol name: ");        
    scanf("%s", name);

    proto = getprotobyname( name );  


    if ( proto != NULL )
    {
        printf("official name: %s\n", proto->p_name);

        printf("proto number: %d\n", proto->p_proto);

        for ( i = 0; proto->p_aliases[i] != 0; i++ ){
                 printf("alias: %s\n", proto->p_aliases[i]);
            }
    }
    else{
        perror("protocol not found");
    }


        return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 2020-06-03
    相关资源
    最近更新 更多