通过数据套接字将文件上传到服务器后,命令的FTP套接字被阻止

时间:2018-06-21 07:53:10

标签: c linux ftp

我的FTP服务器是IIS。我在存储文件后关闭了数据套接字,但是,我发现cmd套接字被阻塞了。真奇怪。似乎服务器数据套接字正在等待数据。 这是我的代码

int client_data_socket = enter_passvie_mode(client_cmd_socket, client_cmd_port + 1, send_buffer, recv_buffer);
FILE *fp;
if ((fp = fopen(filename, "rb")) == NULL)
{
    close(client_data_socket);
    printf("open file failed\n");
    exit(1);
}
size_t char_size = sizeof(char);
char data_buffer[FILE_READ_BUFFER_SIZE];
int numread;
for (;;)
{
    bzero(data_buffer, FILE_READ_BUFFER_SIZE);
    numread = fread(data_buffer, char_size, FILE_READ_BUFFER_SIZE, fp);
    if (numread < 0)
    {
        printf("read file failed\n");
        break;
    } 
    else if (numread > 0)
    {
        int length = send(client_data_socket, data_buffer, numread, 0);
        if (length == 0)
        {
            break;
        }
        else if (length < 0)
        {
            if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR)
            {
                continue;
            }
            printf("[PUT] command send data failed\n");
            exit(1);
        }
    }
    if (numread == FILE_READ_BUFFER_SIZE) continue;
    else {
        break;
    }
}
close(client_data_socket);
printf("close data socket\n");
fclose(fp);
exit(0);

command 放置文件后,其他命令被阻止,它显示命令的套接字被阻止。我是否应该做其他事情来通知服务器数据传输已结束?

source code

1 个答案:

答案 0 :(得分:0)

我找到了答案:
套接字未与其他进程共享时,close将发送FIN数据包并立即销毁fd。
就我而言,父进程与子进程共享client_data_socket。因此,我需要使用shutdown函数来发送FIN