我正在尝试制作支持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 ;;
两次编写相同代码的情况下完成此操作答案 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