while循环判断条件为阻塞函数的情况
第一次发帖,可能有好多东西不会,请谅解;
服务器通过sock_data句柄将文件内容发送给客户端,在发送完毕后,通过sock_control句柄,发送一个226的数字给客户端,表示文件已经发完。
客户端while循环,通过sock_data句柄,接收数据并打印出来,之后通过sock_con得到服务器传输完成的消息。
现在的问题是:当客户端接收完所有数据时,我认为它会阻塞在while ((num_recvd = recv(sock_data, buf, MAXSIZE, 0)) > 0) 这里,因为数据已经取完了,recv的返回值好像只有-1(出错),0(对端关闭),正数(接收到的字节数),所以没有数据时,它不就阻塞在这里了吗?所以客户端程序怎么能跳出这个while循环,去接收服务器完成的发送的消息呢?
(也不知道自己是否表述清楚了。。。)
服务器一侧的程序:
int ftserve_list(int sock_data, int sock_control)
{
………………………………
/* 通过数据连接,发送tmp.txt 文件的内容 */
while ((num_read = fread(data, 1, MAXSIZE, fd)) > 0)
{
if (send(sock_data, data, num_read, 0) < 0)
perror("err");
memset(data, 0, MAXSIZE);
}
fclose(fd);
send_response(sock_control, 226); // 发送应答码 226(关闭数据连接,请求的文件操作成功)
return 0;
}
客户端一侧的程序:
/* 接收服务器传来的数据 */
while ((num_recvd = recv(sock_data, buf, MAXSIZE, 0)) > 0)
{
printf("%s", buf);
memset(buf, 0, sizeof(buf));
}
if (num_recvd < 0)
perror("error");
/* 等待服务器完成的消息 */
if (recv(sock_con, &tmp, sizeof tmp, 0) < 0)
{
perror("client: error reading message from server\n");
return -1;
}