我的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 放置文件后,其他命令被阻止,它显示命令的套接字被阻止。我是否应该做其他事情来通知服务器数据传输已结束?
答案 0 :(得分:0)
我找到了答案:
当套接字未与其他进程共享时,close
将发送FIN数据包并立即销毁fd。
就我而言,父进程与子进程共享client_data_socket
。因此,我需要使用shutdown
函数来发送FIN
。