WaitForMultipleObjects - 如何正确处理stdin和套接字(FTP客户端)

时间:2015-10-29 10:53:12

标签: c sockets asynchronous winsock

我正在编写一个简单的C FTP客户端。从FTP(21)和FTP-DATA(被动)套接字接收数据时遇到一些问题。那是我的主程序循环:

    input_handles[0] = GetStdHandle(STD_INPUT_HANDLE);
    input_handles[1] = WSACreateEvent();
    input_handles[2] = INVALID_HANDLE_VALUE;
    WSAEventSelect(connection->socket, input_handles[1], FD_READ);

    while (1) {
        wait_result = WaitForMultipleObjectsEx(num_in_handles, input_handles, FALSE, INFINITE, FALSE);

        if (wait_result == WAIT_OBJECT_0) {
            fgets(input_line, input_len, stdin);
            ftp_cmd(connection, input_line);

            if (_strnicmp(input_line, "QUIT", 4) == 0) {
                WSACloseEvent(input_handles[1]);
                break;
            }
        }

        if(wait_result == WAIT_OBJECT_0 + 1 || wait_result == WAIT_OBJECT_0 + 2) {
            if (WaitForSingleObject(input_handles[1], 0) == WAIT_OBJECT_0) {
                ftp_recv(connection, &cmd_output);

                if (cmd_output != NULL) {
                    printf(cmd_output);

                    if (strncmp(cmd_output, "227", 3) == 0) { // 227 - enter passive mode
                        CHECK_ERROR(ftp_passive(connection, cmd_output, &input_handles[2]));
                        num_in_handles = 3;
                    }

                    if(strncmp(cmd_output, "226", 3) == 0) { // 226 - exit passive mode
                        ftp_passive_close(connection, &input_handles[2]);
                        num_in_handles = 2;
                    }

                    SAFE_FREE(cmd_output);
                }
            }

            if(num_in_handles == 3 && WaitForSingleObject(input_handles[2], 0) == WAIT_OBJECT_0) {
                ftp_recv_pasv(connection, &cmd_output);

                if (cmd_output != NULL)
                    printf(cmd_output);
                SAFE_FREE(cmd_output);

                // WORKS GOOD WITH THIS UNCOMMENTED
                //ftp_passive_close(connection, &input_handles[2]);
                //num_in_handles = 2;
            }
        }
    }

ftp_passive()打开一个套接字到服务器给出的地址,并创建WSA事件(input_handles[2])。 ftp_passive_close()关闭此套接字和事件。

我不知道为什么它与评论片段一起使用。当它被评论时,我的客户端不会从任何套接字接收任何更多数据。 我的代码出了什么问题?

0 个答案:

没有答案