繁体   English   中英

recv()接收到不正确的数据

[英]recv() recieves incorrect data

当我尝试查找一行代码并以通常的方式获取密码(id,salt,hash)时,它可以正常工作。

struct spwd *shadow_file_line;
char *full_pass;

int main(int argc, char *argv[])
{
  shadow_file_line = getspnam("root");
  full_pass = shadow_file_line->sp_pwdp;
  printf("%s\n", full_pass);
}

但是,当我尝试使用recv()做同样的事情时,出现了问题。

char recieve_login_buffer[20];
    char recieve_password_buffer[20];

    char *send_msg_greet = "proftpd clone 0.1beta\n";
    send(new_sck, send_msg_greet, strlen(send_msg_greet), 0);

    char *send_msg_login_request = "Login: ";
    send(new_sck, send_msg_login_request, strlen(send_msg_login_request), 0);

    recv(new_sck, &recieve_login_buffer, sizeof recieve_login_buffer, 0);
    printf("Login entered: %s", recieve_login_buffer);

    char *send_msg_password_request = "Password: ";
    send(new_sck, send_msg_password_request, strlen(send_msg_password_request), 0);

    recv(new_sck, &recieve_password_buffer, sizeof recieve_password_buffer, 0);
    printf("Password entered: %s", recieve_password_buffer);

    sp = getspnam(recieve_login_buffer);
    full_encrypted_pass = sp->sp_pwdp;
    printf("%s\n", full_encrypted_pass);

那么我该如何更改服务器收到的单词? 我不知道我使用的是哪个服务器或telnet客户端添加了缓冲区。

这不是实际的方法。 您将需要编写一些辅助函数。

  1. recv()不会对读入缓冲区的数据进行空终止。 它返回已读取的字节数; 您需要使用此值。

  2. 流套接字上的recv()不能保证将以与传输数据相同的帧接收数据。 特别是,它不能保证一整行输入-或仅一行输入! -将会收到。 在最坏的情况下,您的应用程序可能在单个recv()调用中仅接收一个字节的输入或两行输入。 您需要将数据读入缓冲区并等待换行符(或其他合适的终止符),然后再处理它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM