我正在编写一个简单的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()
关闭此套接字和事件。
我不知道为什么它与评论片段一起使用。当它被评论时,我的客户端不会从任何套接字接收任何更多数据。 我的代码出了什么问题?