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

时间:2018-12-13 00:28:46

标签: c unix

当我尝试查找一行代码并以通常的方式获取密码(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 个答案:

答案 0 :(得分:3)

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

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

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