2013-01-17 58 views
0

我已經寫了程序讀取客戶端的簡單文本。 當telnet發送消息時,該程序運行良好,但在ftp發送消息時該程序不起作用。 此外,程序誤解(?)套接字連接良好。 (見圖) 事實上,ftp客戶端試圖連接我的服務器,並且隨着時間的推移,ftp客戶端連接失敗。我想用我的服務器程序讀取ftp消息。我該怎麼辦??我想讀取FTP命令

服務器程序 -

#include <pthread.h> 
#include <sys/types.h> 
#include <sys/socket.h> 

#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <stdio.h> 

#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 

#define MAXLINE 1024 
#define PORTNUM 3600 

void * thread_func(void *data) 
{ 
    int sockfd = *((int *)data); 
    int readn; 
    socklen_t addrlen; 
    char buf[MAXLINE]; 
    struct sockaddr_in client_addr; 
    memset(buf, 0x00, MAXLINE); 
    addrlen = sizeof(client_addr); 
    getpeername(sockfd, (struct sockaddr *)&client_addr, &addrlen); 

    while((readn = read(sockfd, buf, MAXLINE)) > 0) 
    { 
     printf("Read Data %s(%d) : %s", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), buf); 
     memset(buf, 0x00, MAXLINE); 
    } 
    close(sockfd); 
    printf("worker thread end\n"); 
    return 0; 
} 

int main(int argc, char** argv) 
{ 
    int listen_fd, client_fd; 
    socklen_t addrlen; 
    int readn; 
    char buf[MAXLINE]; 
    pthread_t thread_id; 

    struct sockaddr_in server_addr, client_addr; 

    if((listen_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) 
     return 1; 

    memset((void*)&server_addr, 0x00, sizeof(server_addr)); 
    server_addr.sin_family = AF_INET; 
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY); 
    server_addr.sin_port = htons(PORTNUM); 

    if(bind(listen_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) 
    { 
     perror("bind error"); 
     return 1; 
    } 
    if(listen(listen_fd, 5) == -1) 
    { 
     perror("listen error"); 
     return 1; 
    } 

    while(1) 
    { 
     addrlen = sizeof(client_addr); 
     client_fd = accept(listen_fd, (struct sockaddr *)&client_addr, &addrlen); 
     if(client_fd == -1) 
     { 
      printf("accept error\n"); 
      // return -1; 
     } 
     else 
     { 
      printf("someone comes in.\n"); 
      fflush(stdout); 
      pthread_create(&thread_id, NULL, thread_func, (void *)&client_fd); 
      pthread_detach(thread_id); 
     } 
    } 
    return 0; 
} 

這裏是數字。 https://docs.google.com/document/d/1sKmk0NfTA9dL2svOPsAtaXt_bSpcT4s62yjHuKZCpIk/edit

回答

0

FTP協議有點複雜......你不能等待客戶端數據,但你必須處理協議的多種情況。

爲了超過第一階段,您必須向客戶端發送一個220 command(FTP橫幅,告訴我們的FTP服務器是什麼,並聲明我們已準備好取回用戶名)。

因此,嘗試通過連接的套接字發送字符串"220-#\r\nMy FTP SERVER\r\n",看看發生了什麼。

添加,就在read()之前調用這些行。

sprintf(buf, "220\r\nMy FTP SERVER\r\n\r\n"); 
write(connected_fd, (void *) buf, strlen(buf)); 
+0

消息「220 - #\ r \ n我的FTP服務器\ r \ n」被打印到我的終端。但我想收到一條消息,ftp-client發送。 T.T你能詳細告訴我多個案例嗎?網站等。 – inherithandle

+1

哇,我明白了。我所要做的就是發送與標準ftp服務器發送給FTP客戶端相同的代碼消息。 – inherithandle

+0

字符串更新...我測試了它,它工作...它將客戶端移動到「用戶」階段 –