0

私は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);
4

0 に答える 0