3

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

2 に答える 2

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); 
于 2013-04-12T16:53:23.497 に答える
0

したがって、通常、サーバーを作成するときは、特定のアドレスではなく、任意のアドレスにバインドするだけです。重要なのは、サーバーがリッスンするポート番号です。クライアントに 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

于 2013-04-12T16:47:12.887 に答える