0

I have one problem with Server/CLient Socket Programming model. On the same system meaning the same computer,I have a server running on one program and the client running another program. The Server/Client are talking thru address 0.0.0.0 and port 3000. The communication is fine.

However, when I have the Server program running one system and Client Program running on another system(two different computers and both of them are Wifi capable) Then Socket Programming model DO not work for my anymore.

Why is that?

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

client side

     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);
4

2 回答 2

2

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

您还应该检查所有这些函数的返回值。它们中的每一个都可能失败,发现问题的第一步是检查所有问题的返回并找出哪个出错了,以及报告的错误消息是什么。

您还使用了一些非常过时的功能。inet_addr()应该替换为getaddrinfo()- 尽管在这种特殊情况下,您根本不需要它,应该使用htonl(INADDR_ANY)- 并且gethostbyname()应该替换为getnameinfo().

于 2013-09-21T03:38:01.570 回答
1

为什么不给客户端一个战斗的机会,给服务器的IP地址呢?

此外 - 对代码进行总结:

即类似的东西

  • inet_addr(srvr_addr); 在其自己的
  • 不使用 INADDR_ANY
  • 为端口号定义变量而不使用它

……

于 2013-09-21T03:45:10.860 回答