【问题标题】:Local Host Server Socket Program not working本地主机服务器套接字程序不工作
【发布时间】:2013-04-12 16:11:26
【问题描述】:

我有用 C 编写的服务器和客户端套接字程序。我想使用 local host ipaddress 127.0.0.1 将客户端程序与笔记本电脑上的服务器程序连接起来。当我执行服务器程序时。它的输出是绑定失败并停止。如何使客户端连接到同一台笔记本电脑上的服务器(即通过本地主机)成为可能。请帮忙。

这是服务器代码(这是一个回显服务器程序):

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>

main(int argc, char *argv[])
{
    int clilen, sockfd, newsockfd, n, cpid;
    char msg[100];
    struct sockaddr_in serv_addr, cli;
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        printf("socket failed to establish\n");
        exit(0);
    }
    printf("socket created\n");
    bzero((char *)&serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
    serv_addr.sin_port = htons(atoi(argv[2]));
    if (bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
    {
        printf("binding failed\n");
        exit(0);
    }
    printf("binding established\n");
    if (listen(sockfd, 5) < 0)
    {
        printf("not listening\n");
        exit(0);
    }
    printf("listening|n");
    for (;;)
    {
        clilen = sizeof(cli);
        if ((newsockfd = accept(sockfd, (struct sockaddr *)&cli, &clilen)) < 0)
        {
            printf("accept failed\n");
            exit(0);
        }
        printf("accepted\n");
        cpid = fork();
        if (cpid == 0)
        {
            n = read(newsockfd, msg, 80);
            msg[n] = '\0';
            write(newsockfd, msg, strlen(msg));
            close(newsockfd);
            exit(0);
        }
    }
}

【问题讨论】:

  • 修正你的格式...这样不可读

标签: c sockets echo-server


【解决方案1】:

我相信问题的发生是因为您通过命令行传递了错误的值。

以下代码行可能没有按预期工作,

serv_addr.sin_addr.s_addr=inet_addr(argv[1]);

请改成

 servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

还要加上这个检查来测试端口号,

unsigned int port;
if ( argc < 2 ) 
{
   port = Some_Port_No;
}
else 
{
   port=atoi(argv[2]);
}

然后改变

serv_addr.sin_port=htons(atoi(argv[2]));

到

servaddr.sin_port = htons(port); 

【讨论】:

    【解决方案2】:

    因此,通常在编写服务器时,您只需将其绑定到任何地址,而不是特定地址。重要的是服务器侦听的端口号。当您告诉客户端连接到 localhost 时,您还将向其传递服务器正在侦听的端口号,以便建立连接。

    尝试改变这个:

    serv_addr.sin_addr.s_addr=inet_addr(argv[1]);
    

    到这里:

    serv_addr.sin_addr.s_addr=INADDR_ANY;
    

    这里有一个链接可以帮助你很多:http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-28
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-23
      • 1970-01-01
      相关资源
      最近更新 更多