2015-06-09 25 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()