两台计算机之间的TCP / IP无法正常工作

时间:2016-09-30 14:48:44

标签: tcp server ip client protocols

我正在进行TCP / IP连接。我有这些代码:

server.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连接到同一台路由器的笔记本电脑。

1 个答案:

答案 0 :(得分:0)

调试这种东西的一般方法是尝试在两个方向上ping,并查看它是否有效。如果不是,则必须检查路由表的配置以及设备上的接口和路由器上的forwarding / firewall / nat设置。确保之后双向ping。

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

相关问题