套接字不会在基本客户端/服务器之间连接

时间:2014-06-25 21:27:21

标签: c sockets network-programming

我正在尝试一个非常基本的套接字连接,该连接在同一主机上运行服务器和客户端时都能正常工作。但是,当两者在不同的机器上并通过互联网连接时,我无法让客户端连接到服务器。我的客户端采用点分十进制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;
}

请帮忙!我没有网络编程或套接字的经验,即使我的代码看起来像我在网上的几个地方看到的那样,我似乎无法解决这个问题。谢谢!

1 个答案:

答案 0 :(得分:0)

如果您的服务器位于NAT /防火墙之后,它实际上意味着外部客户端将无法访问您的服务器的IP /接口。但这可以通过配置NAT(或防火墙)来执行反向NAT或某种端口重定向来管理。您可以要求您的网络管理员为您执行此配置。 另一种解决方案是使用VPN(同样需要管理员),这样你就有了一对可以访问的IP地址。 并且作为最后一个选项,它不是很优雅,但可能用于测试目的,如果其中一个主机具有SSH服务器并且其中至少有一个具有公共IP,则可以进行端口转发。