套接字编程仅适用于同一系统,不适用于不同的系统

时间:2013-09-21 03:10:26

标签: c sockets

我遇到了Server / CLient Socket Programming模型的一个问题。在同一个系统上意味着同一台计算机,我有一个服务器在一个程序上运行,而客户端运行另一个程序。服务器/客户端通过地址0.0.0.0和端口3000进行通信。通信正常。

然而,当我让服务器程序运行一个系统并且客户端程序在另一个系统上运行时(两台不同的计算机,并且它们都具有Wifi功能),那么套接字编程模型不再适用于我了。

为什么?

   portno=30000;
    serv_addr.sin_family = AF_INET;


    char *srvr_addr=NULL;
    srvr_addr="0.0.0.0";
    inet_addr(srvr_addr);

    serv_addr.sin_addr.s_addr =inet_addr(srvr_addr);

    serv_addr.sin_port = htons(portno);
    bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));

    listen(sockfd,5);

    while (1)
    {

    clilen = sizeof(cli_addr);

    newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);

客户端

     int sockfd, portno, n;
    struct sockaddr_in serv_addr;
    struct hostent *server;

    char buffer[256];

    portno=3000;
    sockfd = socket(AF_INET, SOCK_STREAM, 0);




     server = gethostbyname("0.0.0.0");

    bzero((char *) &serv_addr, sizeof(serv_addr));

   serv_addr.sin_family = AF_INET;
    //source, destination
    bcopy((char *)server->h_addr,
          (char *)&serv_addr.sin_addr.s_addr,
          server->h_length);
    serv_addr.sin_port = htons(30000);

   serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    int result;
    result=connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr));

    fgets(buffer,255,stdin);
    n = write(sockfd,buffer,strlen(buffer));

    bzero(buffer,256);
    n = read(sockfd,buffer,255);

2 个答案:

答案 0 :(得分:2)

您无法通过网络将客户端连接到IP地址0.0.0.0,这只能在同一台计算机上运行。您需要让您的客户端连接到您的服务器所具有的真实IP地址。将服务器设置为侦听"0.0.0.0",或者htonl(INADDR_ANY)告诉它监听任何可用的IP地址,但这不是网络中的可路由地址,它只会连接到{{ 1}}当你在本地使用它时,这就是为什么当它们在同一台计算机上时它为你工作,但当它们在不同的计算机上时却不起作用。运行localhost以查找服务器计算机的真实IP地址,并让您的客户端连接到该地址。

您还应该检查所有这些功能的返回值。他们中的每一个都可能失败,找到问题的第一步是检查所有问题的返回,找出哪一个出错,以及报告的错误信息是什么。

您还使用了一些非常陈旧的功能。 ifconfig应替换为inet_addr() - 尽管在这种特殊情况下,您根本不需要它,而应使用getaddrinfo()代替 - htonl(INADDR_ANY)应替换为gethostbyname() getnameinfo()

答案 1 :(得分:1)

为什么不给客户一个战斗机会并提供服务器的IP地址?

此外 - 关于代码的总结:

即。像

这样的东西
  • inet_addr(srvr_addr);
  • 不使用INADDR_ANY
  • 为端口号定义变量而不使用它

...