C中的套接字编程不适用于两台不同的PC

时间:2013-08-21 17:34:45

标签: c sockets

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

这是代码: 对于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;
    }

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

此外,当尝试连接到服务器时,总是尝试通过使用gethostbyname()等调用来获取与服务器名称相关联的IP,这是因为您的服务器IP可能只是因为DNS refesh而改变,但几乎所有时间都是主机名保持不变。

答案 2 :(得分:0)

正如其他人所说,您必须了解底层网络。即使您获得静态IP,也可能无法与您的应用进行通信。可能的原因是:

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

您必须使用ping,traceroute,telnet(以及可能的其他网络工具)来诊断网络问题。

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