C - Socket网络编程 - 字符串不会产生相等性

3

我一直在使用C语言进行套接字网络编程,为的是验证客户端提供的密码。我已经设置好了所有内容,套接字也能够通信,但当我发送一个字符串并使用strcmp()比较这些字符串时,尽管打印出来的字符串相同,但它们不会返回0(我相信这表示这些字符串是相同的),如下所示:

请注意,客户端和服务器端是独立的程序,在我的机器上通过本地主机进行通信。

/*Client Side */

char password[64] = {0};

fgets(password, 64, stdin);

write(sockfd, password, 64);



/*Server Side */

char password[64] = "password";

char password_buffer[64];

read(newsockfd, password_buffer, 64);

if(strcmp(password, password_buffer) != 0)
    {
    printf("Password Incorrect\n");
    {
else 
    {
    printf("Password correct\n");
    }

非常感谢您的帮助。我认为可能涉及到bzero或memset的使用,但我不确定它们是如何相关的。


4
你忽略了read的返回值,所以你不知道读取了多少字节。你指望strcmp怎么知道呢? - David Schwartz
read 可能读取少于 64 字节。它会返回读取的字节数。如果不足 64 字节,则需要使用剩余部分重复。 - fukanchik
可能是字符串终止问题。在read之后检查password_buffer的内存。我也会将其初始化为全0,并且只读取63个字节以确保最后一个是\0 - yano
那么我需要用零填充其余的内存吗?如果这是一个愚蠢的问题,我很抱歉,因为我对C语言还不太熟悉。顺便说一句,谢谢大家! - milesb
@DavidSchwartz 我已经考虑过这个问题了,我希望在每个大小上都有一个固定大小的数组是可以的,到目前为止还没有出现问题,尽管我很容易被证明是错误的!我从一本旧教科书中得到了网络编程代码,解释相当有限,尽管它使用的是AF_INET,我相信那是IP,如果这能让你更容易理解的话?如果确实是个问题,你有什么建议来解决吗?再次感谢你的帮助! - milesb
显示剩余3条评论
1个回答

4

fgets(password, 64, stdin); 可能会在字符串末尾添加一个换行符 (\n)。在使用 fgets 后从客户端字符串中删除它,或在服务器端的比较字符串末尾添加一个换行符。

要从客户端字符串中删除尾随的换行符,可以使用以下方法:
password[strcspn(password, "\r\n")] = 0;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接