【问题标题】:Cannot connect to localhost无法连接到本地主机
【发布时间】:2014-11-06 23:56:04
【问题描述】:

我正在运行 linux mint 并在命令终端中输入了一些命令来连接到我的本地主机,但它一直说连接失败。

这是我输入的内容:

echo "echo test" | ./<my executable> localhost <port #>

这是我的连接代码:

  int r = connect(sock, addrList->ai_addr, addrList->ai_addrlen);
  if (r < 0) {
    printf("Connection failed\n");
    exit(1);
  }

这里是完整的代码:

int main(int argc, char *argv[]) {
  if (argc != 3) {
    printf("Invalid arguments\n");
    exit(1);
  }

  char *serverIP = argv[1]; /*Server hostname*/
  char *portNumber = argv[2]; /*Port Number*/
  void *numericAddress;
  char addrBuffer[INET6_ADDRSTRLEN];
  in_port_t port;
  char buffer_stdin[65535];
  char buffer_stdout[65535];
  int bytes_read = 0;
  int bytes_written = 0;

  /*getting integral number of string representation of port number*/
  in_port_t servPort = atoi(argv[2]);

  /*------------------get binary number of hostname-----------------*/
  struct addrinfo addrCriteria;
  memset(&addrCriteria, 0, sizeof(addrCriteria));
  addrCriteria.ai_family = AF_INET;
  addrCriteria.ai_socktype = SOCK_STREAM;
  addrCriteria.ai_protocol = IPPROTO_TCP;

  struct addrinfo *addrList;

  int rtnVal = getaddrinfo(serverIP, portNumber, &addrCriteria, &addrList);
  if (rtnVal != 0) {
    printf("getaddrinfo() failed\n");
    exit(1);
  }

  numericAddress = &((struct sockaddr_in *) (addrList->ai_addr))->sin_addr;
  /*Converting port to binary*/
  ((struct sockaddr_in *)(addrList->ai_addr))->sin_port = htons(servPort);
  /*----------------------------------------------------------------*/

  inet_ntop(addrList->ai_addr->sa_family, numericAddress, addrBuffer, sizeof(addrBuffer));
  printf("IP ADDRESS: %s\n", addrBuffer);

  /*Creating socket*/
  int sock = socket(AF_INET,SOCK_STREAM, IPPROTO_TCP);
  if (sock < 0) {
    printf("error creating socket\n");
    exit(1);
  }

  /*Establish connection to the echo server*/
  int r = connect(sock, addrList->ai_addr, addrList->ai_addrlen);
  if (r < 0) {
    perror("Connection failed\n");
    exit(1);
  }

  /*Reading from stdin and writing to socket until stdin ends
  bytes_read = read(0, buffer_stdin, sizeof(buffer_stdin));
  write(sock, buffer_stdin, bytes_read);*/

  while ((bytes_read = read(0, buffer_stdin, sizeof(buffer_stdin)-1)) > 0) {
    write(sock, buffer_stdin, bytes_read);
  }

  /*Shutting down write end of socket*/
  int r_shutdown = shutdown(sock, SHUT_WR);
  if (r_shutdown < 0) {
    printf("Shutting down write end of socket failed\n");
    exit(1);
  }

  /*Reading from socket and writing to stdout until socket ends*/
  while ((bytes_read = read(sock, buffer_stdout, sizeof(buffer_stdout)-1)) > 0) {
    write(1, buffer_stdout, bytes_read);
  }

  close(sock);
  exit(0);
}

我需要安装一些东西来连接到本地主机吗?

谢谢

编辑:好的,这是更新:

首先我在命令终端中输入:chmod a+x exe(其中 exe 是我们的 UDP 服务器) 然后我输入: ./exe 例如./exe 2525 然后我输入: echo "echo test" | ./本地主机

但是当这种情况发生时,终端不会返回“echo test”,它只是坐在那里,就像它正在等待用户的输入一样,或者就像它陷入无限循环一样。

【问题讨论】:

  • 您没有向我们展示足够的代码。另外,使用perror("Connection failed\n"); 而不是printf("Connection failed\n"); 查看连接失败的原因
  • 好吧我试试
  • 它说“:连接被拒绝”。我将发布我的其余代码
  • 好的,这意味着没有人在监听那个端口(所以没有人接受你的连接请求)
  • 我们的教授为我们提供了一个服务器。我们连接到服务器,写入套接字,然后从套接字读取并写回 stout。我们无权访问服务器中的代码。

标签: c linux unix ip localhost


【解决方案1】:

看来您需要在命令行中提供本地主机:

./exe localhost 2525

或:

echo test | ./exe localhost 2525

【讨论】:

  • 还是不行。我认为您在谈论大端与小端时是对的,因为在我们班上教授说,如果您不使用正确的方法,这将是项目的一个大问题。那么我应该尝试哪个? htonl() 而不是 htons()?
  • 我相信你所拥有的是好的。执行命令netstat -an -A inet | grep :2525 是否显示您的教授监听器正在运行?如果没有,那就是答案
  • 当我输入它时没有任何反应。我没有得到任何回报。什么意思?
  • 与你的教授(或他的“助教”,如果有的话)交谈——他的听众可能没有在听/正在听或也许你在端口上弄错了#
猜你喜欢
  • 2016-01-01
  • 2021-06-20
  • 2015-07-26
  • 2015-11-04
  • 2016-04-25
  • 2015-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多