【发布时间】:2017-12-09 11:17:47
【问题描述】:
所以我正在尝试制作自己的 FTP 客户端,我能够连接到 ftp 服务器并获得“220”响应代码,但是当我尝试发送任何命令时,recv 函数就会被阻止。这是我的代码:
我尝试了多个免费的 ftp 服务器,我能够连接到所有这些服务器并获得 220 响应代码,但从那里我根本无法与它们通信。
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#define ERR(str) {printf("%s errno says: %s\n", str, strerror(errno));}
int getFTPcode(int sock){
char response[2550];
if(0 > recv(sock, response, 2550, 0)){
ERR("ftp response failed to recv");
return 0;
}
printf("%s\n", response);
while(1){
char msg[2000];
printf("Enter command:");
scanf("%s", msg);
if(0 > send(sock, msg, strlen(msg), 0)){
ERR("failed to send to server");
return 0;
}
if(0 > recv(sock, response, 2000, 0)){
ERR("failed to recv from server");
return 0;
}
printf("Response: %s\n", response);
}
printf("%s\n", response);
}
int connToOrig(char* ip, short port){
struct sockaddr_in addrin;
memset(&addrin, '0', sizeof(struct sockaddr_in));
addrin.sin_family = AF_INET;
addrin.sin_port = htons(port);
if(inet_pton(AF_INET, ip, &addrin.sin_addr) < 0){
ERR("inet_pton failed");
return 0;
}
int sock;
if(0 > (sock = socket(AF_INET, SOCK_STREAM, 0))){
ERR("socket() failed");
return 0;
}
if(connect(sock, (struct sockaddr*)&addrin, sizeof(addrin)) < 0){
ERR("connection to the origin server failed");
return 0;
}
printf("connection succesfull\n");
getFTPcode(sock);
return 1;
}
int main(int argc, char** argv){
connToOrig(argv[1], 21);
return 0;
}
【问题讨论】: