私はCとソケットの初心者です。私は単純な ftp サーバーとクライアントを C で書きました。最初はうまくいきましたが、pwd にオプションを追加すると壊れてしまいました。サーバーがキーボード入力を待機する代わりに、入力がないというシナリオで実行されます。デフォルト設定を使用しているため、ブロックする必要があります。また、recv() に MSG_WAITALL を追加しましたが、変更はありません。私は何を間違っていますか?
関連するサーバー コードが続きます (これは、クライアントのファイル リストを生成し、クライアント側の入力を介してファイル名が転送されるのを待つ部分です)。
//wait for ls command
if ((numbytes = recv(new_fd, buf, MAXDATASIZE - 1, 0)) == -1) {
perror("recv");
exit(1);
}
//remove newline from fgets
strip_newline(buf, sizeof(buf));
int result = strncmp(cmd, buf, 2);
if (result == 0){
//list files
file = fopen ("temp", "wb"); //we store our file listing in this temp file
char cmd_buffer[LENGTH];
dp = opendir ("./");
if (dp != NULL){
while (ep = readdir (dp))
fprintf(file, "%s\n", ep->d_name);
(void) closedir (dp);
}else
perror ("Couldn't open the directory");
//send our list down the wire
fclose(file);
file = fopen ("temp", "rb");
bzero(buffer, LENGTH);
while ((res = fread(buffer, sizeof(char), LENGTH, file)) > 0){
if(send(new_fd, buffer, res, 0) < 0){
fprintf(stderr, "ERROR: Failed to send file %s. (errno = %d)\n", buf, errno);
break;
}
bzero(buffer, LENGTH);
}
fclose(file);
//read filename
if ((numbytes = recv(new_fd, buf, MAXDATASIZE - 1, MSG_WAITALL)) == -1) {
perror("recv");
exit(1);
}
//remove newline from fgets
strip_newline(buf, sizeof(buf));
printf("Trying to open %s\n", buf);