簡體   English   中英

send()和puts()混合在一起(用C編寫FTP服務器)

[英]send() and puts() are mixed together, (programming a FTP server in C)

我正在用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
  • 狀態:韋爾賓登遇見[:: 1]:21 ...
  • 狀態:正在使aangemaakt,Welkomstbericht afwachten ...
  • Antwoord:220 JEDI FTP已准備就緒
  • 突擊隊:USER yoda
  • Antwoord:建立連接
  • Fout:Kan Niet Verbinden遇到服務器

因此,它發送的不是“ 331需要密碼”,而是發送的“已建立連接”

希望您能對此有所幫助,非常感謝。

問題是您sendlen參數太大。 send沒有以null結尾的字符串的概念; 它僅適用於原始字節序列。 因此,調用send(newfd, "220 JEDI FTP is ready", 50, 0)發送字符串"220 JEDI FTP is ready" ,然后所有后續的操作都將存儲在內存中。 從技術上講,這是未定義的行為 ,因此實際上任何事情都可能發生(通常是段錯誤)。 在您的情況下,由於常量文字字符串通常順序存儲在內存中,因此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數據包指定了字符串的大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM