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

时间:2015-10-12 15:43:46

标签: c++ c global-variables

我正在尝试制作支持IPV4或IPV6的内容。 这两个代码类似,所以我试过这样的东西。 由于以后代码的唯一区别取决于这个sin变量,我怎么能只编译其中一个。让我们假设" ipv" IF语句中的变量为true或false取决于用户输入

//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

所以问题是如何在不使用不同的&#34; sin&#34 ;;

两次编写相同代码的情况下完成此操作

2 个答案:

答案 0 :(得分:2)

我这样做是通过使用sockaddr_storage及其运作良好

[domain@localhost:9990 /] /host=master/system-property=com.acme.jdbc.url:add(boot-time=true, value=/mypath)
{
    "outcome" => "success",
    "result" => undefined,
    "server-groups" => {"main-server-group" => {"host" => {"master" => {
        "server-one" => {"response" => {"outcome" => "success"}},
        "server-two" => {"response" => {"outcome" => "success"}}
    }}}}
}

答案 1 :(得分:1)

这可能是您使用 union 的典型案例。

typedef union {
    struct sockaddr_in v4;
    struct sockaddr_in6 v6;
} sockaddr_union;

sockaddr_union sin;

然后,当你知道你正在使用IPV4时,使用sin.v4代替罪,当你知道你正在使用IPV6时,使用sin.v6

相关问题