1

何らかの理由で、ソケットのrecvfrom()関数が、想定どおりにサーバーコードをブロックしていません。ローリングセッションキーシステムを作成するための基本的なUDPサーバーを作成しています。

私はここで何が間違っているのですか?この行の後((n <1)を入れる前)に続き、クラッシュしていました。recvfrom()は、クライアントから何かを取得するまでプログラムの実行を停止することになっていると確信しています...

    int sockfd, portNumber;
    socklen_t clilen;
    char buffer[BUFFER_LENGTH];
    struct sockaddr_in serv_addr, from;
    int n;

    // Invalid arguments
    if (argc < 2)
        exit(0);
    else if (atoi(argv[1]) > 65535 || atoi(argv[1]) < 1)
        exit(0);

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) 
    {
        printf("Error opening socket.\n");
        exit(0);
    }

    // Taken from reference
    bzero((char *) &serv_addr, sizeof(serv_addr));
    portNumber = atoi(argv[1]);
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(portNumber);
    if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) 
    {
        printf("ERROR on binding.\n");
        close(sockfd);
        exit(0);
    }

    // Get initial session key request
    int fromlen = sizeof(struct sockaddr_in);
    n = recvfrom(sockfd, buffer, BUFFER_LENGTH, 0, (struct sockaddr *)&from, &fromlen);
    if (n < 0)
    {
        printf("Error in receiving.\n");
        exit(1);
    }

ありがとう

4

1 に答える 1

5

UDP用のストリームソケットを使用しようとしています。

sockfd = socket(AF_INET, SOCK_STREAM, 0);

あなたがやろうとしていることはおそらく;

sockfd = socket(AF_INET, SOCK_DGRAM, 0);

recvfrom接続されていないストリームソケットで実行しようとすると、エラーが発生してすぐに返される可能性があります。次回errnoは、ヒントを確認することをお勧めします。

于 2012-10-07T06:00:03.507 に答える