C 连接()到外部IP不工作

C 连接()到外部IP不工作,c,linux,sockets,unix,C,Linux,Sockets,Unix,我正在用C编写一个简单的服务器/客户端程序。我试图在IP上打开一个可以从任何地方访问的端口。目前,我的服务器只适用于127.0.0.1(本地机器)和0.0.0(我不知道)。我已经指定了IP\u TRANSPARENT选项以及所有这些选项,但是客户端在connect上仍然失败 服务器: // definitions, everything struct addrinfo hints, *res; hints.ai_family = AF_INET; hints.ai_socktype = SOC

我正在用C编写一个简单的服务器/客户端程序。我试图在IP上打开一个可以从任何地方访问的端口。目前,我的服务器只适用于
127.0.0.1
(本地机器)和
0.0.0
(我不知道)。我已经指定了
IP\u TRANSPARENT
选项以及所有这些选项,但是客户端在
connect
上仍然失败

服务器:

// definitions, everything
struct addrinfo hints, *res;

hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;

getaddrinfo("192.168.1.1","4001",&hints,&res);

sockfd = socket(res->ai_family,res->ai_socktype,res->ai_protocol);

setsockopt(sockfd,IPPROTO_IP,IP_TRANSPARENT,(void*)&sockopt,sizeof(sockopt));

bind(sockfd,res->ai_addr,res->ai_addrlen);
listen(sockfd,0);

addr_size = sizeof(ext_addr);
extfd = accept(sockfd,(struct sockaddr *)&ext_addr,&addr_size);

write(extfd,"Success",7);
// cleanup
客户:

// definitions, everything
struct sockaddr_in serv_addr;

sockfd = socket(AF_INET,SOCK_STREAM,0);
setsockopt(sockfd,IPPROTO_IP,IP_TRANSPARENT,(void*)&sockopt,sizeof(sockopt));

serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(4001);

inet_pton(AF_INET,"192.168.1.1",&serv_addr.sin_addr);

connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr));  // fails here
read(sockfd,rcvBuf,sizeof(rcvBuf)-1);

// clean up

我的问题是什么?为了方便起见,我已进行了错误检查。我确信服务器运行良好。客户端在127.0.0.1中运行正常。

通常,您不能将
绑定()
到不属于本地计算机的IP。但是,根据
IP\u透明
文档:

IP_透明(自Linux 2.6.24起)
设置此布尔选项可在此套接字上启用透明代理此套接字选项允许调用应用程序绑定到非本地IP地址,并以外部地址作为本地端点作为客户端和服务器进行操作。注意:这需要设置路由,使发送到外部地址的数据包通过TProxy box(即,承载使用IP_透明套接字选项的应用程序的系统)进行路由。。启用此套接字选项需要超级用户权限(CAP_NET_ADMIN功能)

使用iptables TProxy目标的TProxy重定向还需要在重定向的套接字上设置此选项

您是否在网络上配置了必要的代理以促进IP透明化

让我们暂时忽略
IP\u TRANSPARENT
,假设它不存在,因为它不常用

127.0.0.1
是IPv4环回地址。如果将服务器绑定到此服务器,则只有连接到
127.0.0.1
的本地IPv4客户端才能连接

0.0.0.0
是IPv4通配符地址。如果将服务器绑定到此,套接字将侦听所有本地IPv4地址。本地计算机或网络上的任何客户端都可以连接到属于服务器计算机的任何IPv4地址

192.168.1.1
是一个特定的IPv4地址。如果将服务器绑定到此,套接字将仅侦听该IPv4地址。本地计算机或网络上的任何客户端都只能连接到该IPv4地址

如果客户端和服务器位于同一台计算机上,则客户端可以连接到服务器绑定到的任何本地IP

如果您的客户端和服务器不在同一台计算机上,bur位于同一网络上,则如果服务器绑定到该网络可访问的IP,则客户端可以连接到服务器。这意味着绑定到
0.0.0.0
192.168.1.1
,然后连接到
192.168.1.1


如果您的客户端和服务器不在同一网络上,则只有当服务器位于具有公共IP的路由器后面时,客户端才能连接到服务器。服务器必须绑定到路由器可访问的本地网络IP,并且路由器必须配置为将其公共IP上给定端口上的入站连接转发到服务器的内部IP。这意味着将服务器绑定到
0.0.0.0
192.168.1.1
,将连接转发到服务器的内部IP,然后连接到路由器的公共IP。

通常,您不能
绑定()
到不属于本地计算机的IP。但是,根据
IP\u透明
文档:

IP_透明(自Linux 2.6.24起)
设置此布尔选项可在此套接字上启用透明代理此套接字选项允许调用应用程序绑定到非本地IP地址,并以外部地址作为本地端点作为客户端和服务器进行操作。注意:这需要设置路由,使发送到外部地址的数据包通过TProxy box(即,承载使用IP_透明套接字选项的应用程序的系统)进行路由。。启用此套接字选项需要超级用户权限(CAP_NET_ADMIN功能)

使用iptables TProxy目标的TProxy重定向还需要在重定向的套接字上设置此选项

您是否在网络上配置了必要的代理以促进IP透明化

让我们暂时忽略
IP\u TRANSPARENT
,假设它不存在,因为它不常用

127.0.0.1
是IPv4环回地址。如果将服务器绑定到此服务器,则只有连接到
127.0.0.1
的本地IPv4客户端才能连接

0.0.0.0
是IPv4通配符地址。如果将服务器绑定到此,套接字将侦听所有本地IPv4地址。本地计算机或网络上的任何客户端都可以连接到属于服务器计算机的任何IPv4地址

192.168.1.1
是一个特定的IPv4地址。如果将服务器绑定到此,套接字将仅侦听该IPv4地址。本地计算机或网络上的任何客户端都只能连接到该IPv4地址

如果客户端和服务器位于同一台计算机上,则客户端可以连接到服务器绑定到的任何本地IP

如果您的客户端和服务器不在同一台计算机上,bur位于同一网络上,则如果服务器绑定到该网络可访问的IP,则客户端可以连接到服务器。这意味着绑定到
0.0.0.0
192.168.1.1
,然后连接到
192.168.1.1

如果您的客户端和服务器不在同一网络上,则只有当服务器位于具有公共IP的路由器后面时,客户端才能连接到服务器。服务器必须绑定到路由器可访问的本地网络IP,并且必须将路由器配置为将其公共IP上给定端口上的入站连接转发到服务器的网络