我正在尝试一个非常基本的套接字连接,该连接在同一主机上运行服务器和客户端时都能正常工作。但是,当两者在不同的机器上并通过互联网连接时,我无法让客户端连接到服务器。我的客户端采用点分十进制IP地址参数,我不确定如何确定服务器的IP。我一直在使用curl ifconfig.me获取外部IP但这似乎并没有起作用。连接尝试超时或无法访问服务器/拒绝连接。我尝试过在AWS,我的学校群集和我的macbook之间进行连接的所有组合;没有工作。
服务器代码:
int listenfd = 0, connfd = 0;
struct sockaddr_in serv_addr;
printf("Listening For Connection...\r");
if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
printf("\n Error : Could not create socket \n");
perror("Socket\n");
return 1;
}
memset(&serv_addr, '\0', sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(9119);
int optval = 1;
if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, (const void *)&optval , sizeof(int)) < 0){
perror("setsockopt");
}
if (bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0){
printf("\n Error : Could not bind socket \n");
perror("Bind");
return 1;
}
if (listen(listenfd, 10) < 0){
printf("\n Error : Listen Error \n");
perror("Listen");
return 1;
}
if ((connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) < 0){
printf("\n Error : Accept Error \n");
perror("Accept");
return 1;
}
客户代码:
printf("What IP Address would you like to connect to?\n > ");
char IP[21] = {'\0'};
fgets(IP, 20, stdin);
strtok(IP, "\n");
printf("\n");
printf("Connecting...\r");
int connfd = 0;
struct sockaddr_in serv_addr;
if((connfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("\n Error : Could not create socket \n");
return 1;
}
memset(&serv_addr, '\0', sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(9119);
if(inet_pton(AF_INET, IP, &(serv_addr.sin_addr))<=0)
{
printf("\n Error: Invalid IP Address Format\n");
return 1;
}
if( connect(connfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
{
printf("\n Error : Connection Failed \n");
perror("Connect\n");
return 1;
}
请帮忙!我没有网络编程或套接字的经验,即使我的代码看起来像我在网上的几个地方看到的那样,我似乎无法解决这个问题。谢谢!
答案 0 :(得分:0)
如果您的服务器位于NAT /防火墙之后,它实际上意味着外部客户端将无法访问您的服务器的IP /接口。但这可以通过配置NAT(或防火墙)来执行反向NAT或某种端口重定向来管理。您可以要求您的网络管理员为您执行此配置。 另一种解决方案是使用VPN(同样需要管理员),这样你就有了一对可以访问的IP地址。 并且作为最后一个选项,它不是很优雅,但可能用于测试目的,如果其中一个主机具有SSH服务器并且其中至少有一个具有公共IP,则可以进行端口转发。