在学习socket文件传输的过程中发现,教程在linux的服务端代码实现中,最后部分的处理如下
shutdown(clientSock, SHUT_WR);
fclose(file);
close(clientSock);
close(sock);
return 0;
但是windows的服务端却多了一句recv(clntSock, buffer, BUF_SIZE, 0);
shutdown(clntSock, SD_SEND); //文件读取完毕,断开输出流,向客户端发送FIN包
recv(clntSock, buffer, BUF_SIZE, 0); //阻塞,等待客户端接收完毕
fclose(fp);
closesocket(clntSock);
closesocket(servSock);
WSACleanup();
system("pause");
return 0;
这里其实是没有必要的,这一句recv阻塞后面的代码,直到客户端接受完整个文件发回 FIN 之后才会继续执行。
那这句话用途在哪呢。或者说作者为啥爱写这一句?
如果是客户端和服务端都会收发消息时,就可以在shutdown之后跟上recv来接受剩下的消息,只要客户端没有调用closeSocket/Shutdown发回FIN,recv都会阻塞代码,直到接受完所有消息后再调用closeSocket断开连接。
ps:关于为什么shutdown大家教程看的过程中就知道了,这里只探讨recv。