c++ - 声明具有相同名称但类型不同的变量

标签 c++ c global-variables

我正在尝试制作支持 IPV4 或 IPV6 的东西。 这两个的代码相似,所以我尝试了这样的事情。 由于稍后代码中的唯一区别取决于这个 sin 变量,我怎么能只编译其中一个。让我们假设 IF 语句中的“ipv”变量是真还是假取决于用户输入

//FOR IPV4
//struct sockaddr_in sin;
//FOR IPV6
//struct sockaddr_in6 sin;
//IPV4


// IPV4 ---------------------------------------
if (ipv){
  struct sockaddr_in sin;   
  if ( (s = socket(AF_INET, SOCK_STREAM, 0 ) ) < 0) { 
    perror("Chyba pri vytvareni socketu");  
    return -1;
  }


  sin.sin_family = AF_INET;     
  sin.sin_port = htons(port_number);
  sin.sin_addr.s_addr  = INADDR_ANY;
}

// IPV6 ---------------------------------------
else{

  struct sockaddr_in6 sin;
  if ( (s = socket(AF_INET6, SOCK_STREAM, 0 ) ) < 0) { 
    perror("Chyba pri vytvareni socketu");  
    return -1;
  }

  sin.sin6_family = AF_INET6;     
  sin.sin6_port = htons(port_number);
  sin.sin6_addr = in6addr_any;
  sin.sin6_flowinfo = 0;
}   

if (bind(s, (struct sockaddr *)&sin, sizeof(sin) ) < 0 ) {
    printf("error on bind\n"); return -1;  
}

if (listen(s, 5)) { 
    printf ("error on listen\n"); 
return -1;
}

sinlen = sizeof(sin);
pid_t pid;

while (1) {


    /* accepting new connection request from client,
    socket id for the new connection is returned in t */
    if ( (t = accept(s, (struct sockaddr *) &sin, &sinlen) ) < 0 ) {
      printf("error on accept\n");  /* accept error */
      return -1;
    }
continues .... not important 

这段代码会给我:

server.cpp: In function ‘int main(int, char**)’:  
server.cpp:132:35: error: ‘sin’ was not declared in this scope
   if (bind(s, (struct sockaddr *)&sin, sizeof(sin) ) < 0 ) {
                               ^
server.cpp:145:19: error: ‘sin’ was not declared in this scope
   sinlen = sizeof(sin);
               ^
make: *** [all] Error 1

所以问题是,如果不使用不同的“罪恶”两次编写相同的代码,我怎样才能做到这一点;

最佳答案

我通过使用 sockaddr_storage 来做到这一点并且它运行良好

struct sockaddr_storage sin;
struct sockaddr_in *sin4;
struct sockaddr_in *sin6;
// IPV4 ---------------------------------------
if (ipv == true){
    sin4 = (struct sockaddr_in*)&sin;   
    if ( (s = socket(AF_INET, SOCK_STREAM, 0 ) ) < 0) { 
         perror("Chyba pri vytvareni socketu");  
         return -1;
    }


    sin4->sin_family = AF_INET;     
    sin4->sin_port = htons(port_number);
    sin4->sin_addr.s_addr  = INADDR_ANY;
}

// IPV6 ---------------------------------------
else{

    sin6 = (struct sockaddr_in6*)&sin;
    if ( (s = socket(AF_INET6, SOCK_STREAM, 0 ) ) < 0) { 
        perror("Chyba pri vytvareni socketu");  
        return -1;
    }

    sin6->sin6_family = AF_INET6;     
    sin6->sin6_port = htons(port_number);
    sin6->sin6_addr = in6addr_any;
    sin6->sin6_flowinfo = 0;
}   

if (bind(s, (struct sockaddr *)&sin, sizeof(sin) ) < 0 ) {
    printf("error on bind\n"); return -1;  
}

if (listen(s, 5)) { 
    printf ("error on listen\n"); 
    return -1;
}

sinlen = sizeof(sin);
pid_t pid;

while (1) {


     /* accepting new connection request from client,
     socket id for the new connection is returned in t */
     if ( (t = accept(s, (struct sockaddr *) &sin, &sinlen) ) < 0 ) {
         printf("error on accept\n");  /* accept error */
     return -1;
     }
     continues .... not important 

关于c++ - 声明具有相同名称但类型不同的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33085120/

相关文章:

c++ - 什么时候应该存储函数的引用或指针?

c++ - 在 C++11 中解析毫秒日期时间的最佳方法是什么

c++ - 我可以用 typedef 对类非静态成员方法做什么

c - C 中的函数声明

javascript - 如何通过将其名称作为字符串传递来创建全局变量?

c++ - C++ 的数据库访问库

c - 将当前区域设置编码中的一个宽字符从 stdin 回显到 stdout

Java清屏功能

php - Blade 如何访问自身之外的已定义变量

javascript - jQuery/Javascript 全局和局部变量混淆 - 基础