如何从另一台计算机和网络以C语言访问我的套接字服务器?

问题描述

我有一个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,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;
}

解决方法

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

他们不能。地址127.0.0.1是 loopback 地址。发送到该地址的数据包始终定向到发送它们的计算机。

我是否可以仅通过更改服务器代码来使我 为端口1001上的连接打开了公共IP?

拥有公共IP吗? 127.0.0.1当然不是一个,而且大多数使用消费者级互联网服务的人都没有。如果确实有,那么您可能必须做出特殊安排才能获得它,并且您可能会为此特权付出更多。

但是,假设您确实拥有公共IP或已安排获得一个IP,则不能,您不能确保通过服务器程序打开了端口。您的程序可以在该地址上侦听而不必大惊小怪,但是您还必须考虑防火墙-至少在您的本地计算机上可能有一个,在本地路由器上至少有一个。

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