【问题标题】:TCP/IP not working between two computersTCP/IP 在两台计算机之间不起作用
【发布时间】:2017-02-09 04:40:21
【问题描述】:

我正在建立 TCP/IP 连接。我有这些代码:

服务器.c

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include<fcntl.h>

int main(){
  int serverid, clientid, n = 0, len;
  char msgsend[512], msgrecv[512];
  struct sockaddr_in server,client;

  serverid = socket(AF_INET, SOCK_STREAM, 0);
  if (serverid < 0) {
    puts("Error creating socket\n");
    return -1;
  }

  memset(&server, 0, sizeof(server));
  memset(msgrecv, 0, sizeof(msgrecv));

  server.sin_family = AF_INET;
  server.sin_addr.s_addr = htonl(INADDR_ANY);
  server.sin_port = htons(5000);

  if(bind(serverid, (struct sockaddr*)&server, sizeof(server)) < 0) {
    printf("Error binding\n");
    return -1;
  }

  if( listen(serverid, 10) < 0){
    printf("ERROR");
    return -1;
  }
  len = sizeof(client);
  clientid = accept(serverid, (struct sockaddr*)&client, &len);
  if (clientid < 0) {
    printf("Connection error\n");
    return -1;
  }
  puts("Connected to client");

  while(1){
    n =  recv(clientid, msgrecv, sizeof(msgrecv) - 1, 0);
    if(n < 0){
      printf("Error while reading...\n");
      return -1;
    }

    printf("client says:\n");
    msgrecv[n] = 0;
    fputs(msgrecv, stdout);
    printf("\n");
    printf("enter your reply\n");
    gets(msgsend);
    send(clientid, msgsend, sizeof(msgsend) - 1, 0);
    printf("\n");
  }
  return 0;
}

client.c

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <fcntl.h>

int main(){
  int sock, n = 0;
  char msgsend[512], msgrecv[512];
  struct sockaddr_in server; 


  memset(&server, 0, sizeof(server));
  memset(msgrecv, 0, sizeof(msgrecv));

  sock = socket(AF_INET, SOCK_STREAM, 0);
  if(sock == -1){
    printf("Could not create a socket!\n");
    return -1;
  }

  server.sin_family = AF_INET;
  server.sin_addr.s_addr = inet_addr("192.168.112.130");
  server.sin_port = htons(5000);


  printf(" Trying to connect...\n");

  if(connect(sock, (struct sockaddr*)&server, sizeof(server)) < 0){
    printf("Error:Connection failed\n");
    return -1;
  }
  printf("Connected\n");
  while(1){
    printf("please enter your reply\n");
    gets(msgsend);

    send(sock, msgsend, sizeof(msgsend) - 1, 0);
    n = recv(sock, msgrecv, sizeof(msgrecv) - 1, 0);

    if(n < 0){
      printf("Read error\n");
    }
    printf("\n");
    printf("server says:");
    msgrecv[n] = 0;
    fputs(msgrecv, stdout);
    printf("\n");
  }
  return 0;
}

我首先在另一个终端运行 ./server,然后运行 ​​./client。如果我使用同一台计算机,它工作正常,但如果我想在一台计算机上使用服务器并在另一台计算机上使用客户端,它永远不会连接。 我不知道我做错了什么。也许我必须使用另一个IP?国外电脑一定有部分代码不一样?

注意:一台电脑是带以太网的台式机,另一台是笔记本电脑,通过 WiFi 连接到同一路由器。

【问题讨论】:

  • 电脑上的操作系统是什么?如果是 Windows,请尝试禁用防火墙,如果是 linux,请在 iptables 或任何防火墙上启用该端口。由于服务器和客户端在同一台机器上正常工作,问题可能出在其他地方。

标签: tcp server ip client protocols


【解决方案1】:

调试这类东西的一般方法是尝试双向 ping,看看它是否有效。如果不是,您必须检查路由表的配置以及设备上的接口以及路由器上的转发/防火墙/nat 设置。确保之后双向 ping 正常。

如果确实有效,请测试您是否可以将 TCP 与 nc 之类的简单程序一起使用,甚至可以在您自己的服务器上使用。如果 ping 有效,但 TCP 连接无效,则可能是其中一个相关主机(通常是服务器)上的防火墙设置。调整设置然后再次测试。如果您不确定自己的应用程序是否正常工作,您可能此时使用了nc 来测试连接,您现在可以继续测试您的应用程序。

【讨论】:

    猜你喜欢
    • 2015-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多