像Java,Python和其他人一样毁了我。我正在尝试通过响应服务器代码来自动化FTP客户端:
例如:
// I know this is ugly, please bear with me
char username[25];
strcat(username, USER); //"USER "
strcat(username, usr); // "foo"
strcat(username, "\n"); // = "USER foo\n"
char password[25];
strcat(password, PASS); //"PASS "
strcat(password, pswd); //"bar"
strcat(password, "\n"); // = "PASS bar\n"
//read/write loop
while (1) {
char* responsePtr;
serverCode = readSocket(sockfd, mybuffer);
if (serverCode == 221)
break;
if (serverCode == 220)
responsePtr = &username;
if (serverCode == 331)
responsePtr = &password;
writeSocket(sockfd, responsePtr);
}
当我尝试这个时,它适用于USER,但我得到了一些错误的PASS文本:
C->S: USER anonymous
S->C: 331 Please specify the password.
C->S: (??_?PASS random
有谁比我更聪明,更有经验给我一些C字符串指针?很显然,这对我没有用处。
答案 0 :(得分:12)
在连接它们之前,需要初始化字符串。默认情况下不会初始化数组。
char username[25] = "";
char password[25] = "";
对于它的价值,您可以使用sprintf
更轻松地创建字符串:
sprintf(username, "USER %s\n", usr);
sprintf(password, "PASS %s\n", pswd);
希望你也意识到使用固定大小的缓冲区是缓冲区溢出错误的一个方法。为了安全起见,您应该确保防范它们。这很烦人,但那对你来说是C:
if (snprintf(username, 25, "USER %s\n", usr) >= 25 ||
snprintf(password, 25, "PASS %s\n", pswd) >= 25)
{
fprintf(stderr, "buffer overflow\n");
exit(EXIT_FAILURE);
}
答案 1 :(得分:1)
一些有用的规则。
答案 2 :(得分:0)
你不应该strcat一个未初始化的数组。 尝试:
char *password[25] = "";
password = strcat(PASS);
为第一个。
此外,您应使用strcat()
代替strncat()
以避免溢出。
我认为这样做更容易:
int len = snprintf(password, 25, "%s %s\n", PASS, pswd);
if (len > 25) {
// oops! password is too long dude :-(
}
答案 3 :(得分:-1)
尝试将“\ n \ 0”而不仅仅是“\ n”添加到用户名和密码数组中。