2015-06-09 30 views
0

我正在爲我的課程使用C++的簡單服務器程序。我們的教授給我們提供了框架代碼,以及評論中的指示。我完成了它,並且它在Unix中編譯,但是我遇到了來自客戶端的密碼認證問題。它是這樣寫的,它可以打印所有可能的選項,但仍不會打印結果。這是程序的功能。 (如果需要,我可以提供整個功能)。所以我的問題是,我的邏輯是否有缺陷,或者是一些小錯誤?TCP服務器C++程序

// PURPOSE: To send 'GOOD_PASSWORD_RESPONSE' to the client over socket file 
// descriptor 'clientFD' and return 'true' if the password 'read()' from 
// 'clientFD' matches 'password', or to send 'BAD_PASSWORD_RESPONSE' to 
// the client and return 'false' otherwise. 
bool didLogin(int clientFD, const char *password) { 
    // I. Application validity check: 
    printf("Process %d authenticating user . . .\n", getpid()); 
    fflush(stdout); 

    // II. See if user successfully logged-in: 
    // II.A. Obtain user's password: 

    char buffer[MAX_LINE]; 
    size_t size = sizeof(buffer); 
    read(clientFD, buffer, size); 
    for (int i = 0; i < sizeof(buffer); i++) { 
     printf("%c", buffer[i]); 
    } 
    // II.B. Handle when user's password does NOT match: 
    if (strncmp(buffer, password, MAX_PASSWORD_LEN) != 0) { 
     strncpy(BAD_PASSWORD_RESPONSE, buffer, MAX_LINE); 
     printf("Process %d bad password.\n", getpid()); 

     return (false); 
    } 

    // II.C. If get here then user's password does match: 
    strncpy(GOOD_PASSWORD_RESPONSE, buffer, MAX_LINE); 
    printf("Process %d good password.\n", getpid()); 

    // III. Finished: 

    return (true); 
} 
+1

什麼樣的優秀例子說明如何不使用C++;如何不認證;沒有正確的初始化/大小參數,怎麼不使用原始緩衝區如何不將業務邏輯與協議實現混合(傳輸細節)。提示:'read'的返回值被忽略。這可能不應該發生 – sehe

+1

@sehe大聲笑,'應該可能不會發生';它幾乎擰了一切:) –

+0

感謝您的幫助,我知道它不是正確的做法,但我必須嚴格遵守提供的骨架代碼。 –

回答

1

您的代碼摘要太短,無法完全分析,但我看到了幾個可能的問題。

1)很明顯,clientFD是一個插座。對於套接字或任何文件描述符上的read()請求,不保證讀取,並返回請求的字節數。您的read()調用可能並實際上可能會返回少於size字節。 2)您的代碼假定read()將始終返回size讀取的字節數,並且將嘗試打印每個字節。由於讀取的字節數可能會更少,因此您的代碼將會讀取並嘗試打印未初始化的內存。未定義的行爲。

3)目前還不清楚GOOD_PASSWORD_RESPONSEBAD_PASSWORD_RESPONSE是什麼。代碼中的最後一條語句看起來不正確。

+1

..以及在不能安全地以null結尾的緩衝區(忽略read所返回的結果的副產品)上幾乎不可避免地調用str *()。 –

2

你的代碼有很多問題。以下是我注意到的前幾個:

  1. 您不使用返回值read()。這個返回值告訴你有多少個字節實際上是讀取的。

  2. 您正在使用strncmp()來比較最大密碼長度。如果您匹配的密碼短於最大值會怎麼樣?

  3. 您好像在幾個地方混合了destsrc參數strncpy()