0

我用C 编写了一个简单的套接字编程应用程序。这段代码正在处理环回地址。如果两台计算机(一台服务器一个客户端)在同一个网络中(我在大学 LAN 网络上尝试过),这个程序也可以很好地工作但是当我尝试在两台完全不同的计算机上运行相同的代码时(在两个不同的网络中)然后它在客户端的“连接”方法中显示错误。客户端无法连接到服务器。请帮帮我。我几乎尝试了所有方法,但没有任何帮助,所以请帮助我。请尽快帮助我现在一个月。先谢谢了!

这是代码:对于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 chat();
int main(){
chat();
}

int chat()
{

  int clientid, n = 0;
  char msgsend[512], msgrecv[512];
  struct sockaddr_in client; 


  memset(msgrecv, '0', sizeof(msgrecv));

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

  client.sin_family = AF_INET;
  client.sin_addr.s_addr = /*INADDR_ANY;*/inet_addr("10.200.56.187");
  client.sin_port = htons(5001);


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

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

    send(clientid, msgsend, sizeof(msgsend) - 1, 0);
    n = recv(clientid, 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;
}



And here is the code:
for 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 chat();
    int main(){
      chat();
      }
    int chat(){

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

      serverid = socket(AF_INET, SOCK_STREAM, 0);

      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(5001);

      bind(serverid, (struct sockaddr*)&server, sizeof(server));

      if( listen(serverid, 10) == -1){
        printf("ERROR");
        return -1;
      }
      len = sizeof(client);
        clientid = accept(serverid, (struct sockaddr*)&client, &len);
      while(1){



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

        printf("client says:");
        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;
    }
4

3 回答 3

1

您正在使用私有 IP作为服务器地址。无法从本地/专用网络外部寻址专用 IP。

于 2013-08-21T17:46:55.983 回答
0

与其他人一样,您必须了解底层网络。即使您获得静态 IP,您也可能无法与您的应用程序通信。可能的原因有:

  • 任何主机或任何路由器/调制解调器中的防火墙。
  • 两个网络中路由器上的 NAT 配置

您必须使用 ping、traceroute、telnet(可能还有其他网络工具)来诊断网络问题。

您可以使用 tcpdump 进行更深入的分析。

于 2013-08-23T06:39:45.747 回答
0

私有 IP 是一回事,您尝试连接的服务器应该在您自己的网络中,或者至少应该是 dns 可解析的。

此外,当尝试连接到服务器时,请始终尝试通过使用 gethostbyname() 等调用来获取与服务器名称关联的 IP,这是因为您的服务器的 IP 可能只是由于 DNS 刷新而更改,但主机名几乎始终保持不变。

于 2013-08-22T05:20:41.080 回答