首页 > 解决方案 > 'SO_USELOOPBACK' 未在此范围内声明

问题描述

我正在检查套接字选项,编译时出现此错误。我试图用谷歌搜索它,看起来以前没有人遇到过这个问题。

#include <netinet/tcp.h> 
#include <stdio.h> 
#include <sys/socket.h> 
#include <arpa/inet.h> 
#include <unistd.h> 
#include <string.h> 
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h> 
#include <stdlib.h> 

static char *sock_str_flag(union val *, int);
struct sock_opts {
    const char *opt_str;
    int opt_level;
    int opt_name;
    char *(*opt_val_str)(union val *, int);
}sock_opts[] = {
{ "SO_USELOOPBACK", SOL_SOCKET, SO_USELOOPBACK, sock_str_flag } //this is the error
};

标签: clinuxsocketsnetworkingnetwork-programming

解决方案


socket 选项SO_USELOOPBACK不是 POSIX 标准。手册页setsockopt()详细描述了的性质SO_USELOOPBACK

  • SO_USELOOPBACK是一个[数字]标准。以 [Digital] 文档功能开头的文本段落包含在 DIGITAL UNIX 软件中,但当前未由适用于所描述界面的任何标准指定。当跨多个 UNIX 平台的源代码可移植性不如这些功能提供的功能重要时,请使用这些功能。

为了便携性,您需要进行ifdef检查。

struct sock_opts {
    const char *opt_str;
    int opt_level;
    int opt_name;
    char *(*opt_val_str)(union val *, int);
}sock_opts[] = {
        /* .... */

#ifdef SO_USELOOPBACK
        {"SO_USELOOPBACK", SOL_SOCKET, SO_USELOOPBACK, sock_str_flag }
#endif

        /* .... */
};

推荐阅读