gpt4 book ai didi

c - send() 和 put() 混合在一起,(用 C 语言编程 FTP 服务器)

转载 作者:行者123 更新时间:2023-11-30 15:31:09 25 4
gpt4 key购买 nike

我正在用 C 语言创建一个 FTP 服务器。在客户端,我使用 FileZilla。到目前为止,我的代码仅包含握手部分。

我遇到的问题是我为终端打印的字符串被发送到 FileZilla。我的问题是如何将这两个分开,我尝试了一些方法,但没有一个给出正确的结果。

这只是我的代码的一部分,但对于我的问题来说,这是有用的部分:

while (FOREVER){
addr_size = sizeof their_addr;

newfd = accept(listener, (struct sockaddr*) &their_addr, &addr_size);
if (newfd == -1){
perror("accept");
continue;
}
if ((send(newfd, "220 JEDI FTP is ready", 50, 0)) <= 0)
perror("error sending");

puts("connection established");
puts("waiting for user & connection");
while (!login){
// username
if (!user){
if ((recv(newfd, buffer, BUFFCON, 0)) <= 0){
puts("error receiving username");

}
else{

if (strstr(buffer, "USER") != NULL){

if (strstr(buffer, name) != NULL){

send(newfd, "331 password required", 50, 0);
puts("username correct");

user = 1;
}
else{
puts("username incorrect");
send(newfd, "430 username incorrect", 50, 0);
}//else
}//if
}//else
}//if user

这是 FileZilla 中的输出:

  • 状态:Adres bepalen van localhost
  • 状态:Verbinden session [::1]:21...
  • 状态:验证 aangemaakt,welkomstbericht afwachten...
  • Antwoword:220 JEDI FTP 已准备就绪
  • 突击队:用户尤达
  • Antwoword:连接已建立
  • Fout:Kan niet verbinden met 服务器

因此,它不是发送“需要 331 密码”,而是发送“已建立连接”

希望您能帮我解决这个问题,非常感谢。

最佳答案

问题是您的 sendlen 参数太大。 send 没有空终止字符串的概念;它仅适用于原始字节序列。因此,调用 send(newfd, "220 JEDI FTP is read", 50, 0) 会发送字符串 "220 JEDI FTP is read",然后无论发生什么情况之后的内存中。从技术上讲,这是未定义的行为,因此实际上任何事情都可能发生(通常是段错误)。在您的情况下,由于常量文字字符串通常按顺序存储在内存中,因此 send 正在读取给定的字符串,然后读取其后面的不同字符串。

您想要做的是发送确切的字符串(顺便说一句,每个命令后都需要 CR-LF 序列\r\n)。不多也不少。您可以实现 sends 函数来发送字符串,如下所示:

ssize_t sends(int fd, const char *str)
{
size_t len = strlen(str);
return send(fd, str, len, 0);
}

另请注意,发送的数据包含空终止符,因为 TCP 数据包指定了字符串的大小。

关于c - send() 和 put() 混合在一起,(用 C 语言编程 FTP 服务器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25038909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com