【问题标题】:How to access my socket server in C language from another computer and network?如何从另一台计算机和网络访问我的 C 语言套接字服务器?
【发布时间】:2020-11-02 12:27:35
【问题描述】:

我有一个 C 套接字,它在 localhost 上的端口 1001 上进行侦听。我还有连接到 ip 127.0.0.1 上的端口 1001 的客户端代码。如果我将客户的代码发送给我的朋友,当我们在不同的网络上时,他怎么能访问我的机器?我是否可以通过更改服务器代码来打开我的公共 IP 以在端口 1001 上进行连接?下面是简单的服务器代码:

obs:我在学习 C。

    #include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>

#define BUFSIZE 256

short SocketCreate(void)
{
  short hSocket;
  printf("Create the socket\n");

  hSocket = socket(AF_INET, SOCK_STREAM, 0);
  // close(hSocket);
  return hSocket;
}

int BindCreatedSocket(int hSocket)
{
  int iRetval = -1, ClientPort = 1001;
  struct sockaddr_in remote = {0};

  remote.sin_family = AF_INET;
  remote.sin_addr.s_addr = htonl(INADDR_ANY);
  remote.sin_port = htons(ClientPort);
  iRetval = bind(hSocket, (struct sockaddr *)&remote, sizeof(remote));

  return iRetval;
}

int main(int argc, char *argv[])
{
  int socket_desc, sock, clientLen;
  struct sockaddr_in client;
  char client_message[200] = {0}, message[9999] = {0};

  char buf[BUFSIZE];

  socket_desc = SocketCreate();
  if (socket_desc == -1)
  {
    printf("Could not create socket");
    return 1;
  }
  printf("Socket created\n");

  if (BindCreatedSocket(socket_desc) < 0)
  {
    perror("bind failed.");
    return 1;
  }

  printf("Waiting for incoming connections...\n");

  listen(socket_desc, 3);

  while (1)
  {
    clientLen = sizeof(struct sockaddr_in);

    sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t *)&clientLen);
    if (sock < 0)
    {
      perror("accept failed");
      return 1;
    }
    // printf("Connection accepted\n");

    memset(client_message, '\0', sizeof(client_message));
    memset(message, '\0', sizeof(message));

    if (recv(sock, client_message, 200, 0) < 0)
    {
      printf("recv failed");
      break;
    }

    if (strcmp(client_message, "exitserver") == 0)
    {
      close(socket_desc);
      close(sock);
      break;
    }
  }
  return 0;
}

【问题讨论】:

  • 您的服务器是否位于通过 NAT 路由器连接到 Internet 的 LAN 中?您是否在 NAT 路由器中为端口 1001 启用了到服务器的端口转发?
  • obs 代表什么?
  • @Gerhardh 那么我需要打开路由器上的端口吗?例如,ngrok 是如何工作的?
  • @ArkadiuszDrabczyk 抱歉。是“观察”的缩写
  • 在我的路由器上,我需要在路由器的 WebUI 中执行此操作。您需要查看手册如何配置端口转发。我不知道 ngrok

标签: c sockets serversocket


【解决方案1】:

我有一个 C 套接字,它在 localhost 上的端口 1001 上进行侦听。我也有 连接到 ip 127.0.0.1 上的端口 1001 的客户端代码。如果我 将客户的代码发送给我的朋友,他怎么能访问我的 机器什么时候我们会在不同的网络上?

他们不能。地址 127.0.0.1 是一个 loopback 地址。发送到该地址的数据包总是被定向到发送它们的机器。

我是否可以通过更改服务器代码来使我的 1001 端口是否开放公网 IP 连接?

公共 IP 吗? 127.0.0.1 肯定不是一个,而且大多数拥有消费级互联网服务的人都没有。如果您确实拥有它,您可能必须做出特殊安排才能获得它,而且您可能会为这项特权支付额外费用。

但是假设您确实有一个公共 IP,或者您已安排获得一个,不,您无法确保通过您的服务器程序打开一个端口。您的程序可以毫不费力地监听该地址,但您还必须考虑防火墙 - 可能至少在您的本地计算机上和本地路由器上的一个。

此外,在您设置公共服务器之前,您最好检查一下您的 ISP 的政策和用户协议。 ISP 禁止在消费者互联网连接上运行面向外部的服务的情况并不少见。他们通常希望您为该特权支付更多费用,这也使 ISP 更容易监管他们的网络。

【讨论】:

    猜你喜欢
    • 2019-10-05
    • 2019-03-02
    • 2011-03-30
    • 2020-07-06
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多