0

我正在用 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 遇到 [::1]:21...
  • 状态:Verbinding aangemaakt, welkomstbericht afwachten...
  • Antwoord:220 JEDI FTP 已准备就绪
  • 突击队:用户尤达
  • Antwoord:已建立连接
  • Fout: Kan niet verbinden 遇到服务器

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

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

4

1 回答 1

1

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

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

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

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

于 2014-07-30T14:16:53.363 回答