今天在看一本書附的源代碼的時候,發(fā)現(xiàn)了一個問題,大家來探討一下:關(guān)于Winsock的
下面是兩個程序,一個是服務(wù)器端的程序,不斷在監(jiān)客戶端的連接
另外一個是客戶端的程序,試圖連接服務(wù)器端
服務(wù)器端的程序代碼:
int main()
{
?// 創(chuàng)建套節(jié)字
?SOCKET sListen = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
?if(sListen == INVALID_SOCKET)
?{
??printf("Failed socket() \n");
??return 0;
?}
?
?// 填充sockaddr_in結(jié)構(gòu)
?sockaddr_in sin;
?sin.sin_family = AF_INET;
?sin.sin_port = htons(4567);
?sin.sin_addr.S_un.S_addr = INADDR_ANY;
?
?// 綁定這個套節(jié)字到一個本地地址
?if(::bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
?{
??printf("Failed bind() \n");
??return 0;
?}
?
?// 進(jìn)入監(jiān)聽模式
?if(::listen(sListen, 2) == SOCKET_ERROR)
?{
??printf("Failed listen() \n");
??return 0;
?}
?
?// 循環(huán)接受客戶的連接請求
?sockaddr_in remoteAddr;
?int nAddrLen = sizeof(remoteAddr);
?SOCKET sClient;
?char szText[] = " TCP Server Demo! \r\n";
?while(TRUE)
?{
??// 接受一個新連接
??sClient = ::accept(sListen, (SOCKADDR*)&remoteAddr, &nAddrLen);
??if(sClient == INVALID_SOCKET)
??{
???printf("Failed accept()");
???continue;
??}
??
??printf(" 接受到一個連接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));
??// 向客戶端發(fā)送數(shù)據(jù)
??::send(sClient, szText, strlen(szText), 0);
??// 關(guān)閉同客戶端的連接
??::closesocket(sClient);
?}
??
?// 關(guān)閉監(jiān)聽套節(jié)字
?::closesocket(sListen);
?::MessageBox(NULL,"","",MB_OK);
?return 0;
}
大家請注意上面的while循環(huán),在不斷監(jiān)聽客戶端的連接。除非你手動關(guān)閉該服務(wù)器程序,否則while循環(huán)是不會退出的。那么,問題是:關(guān)閉套接字的那段代碼始終不會執(zhí)行(我用MessageBox做了試驗(yàn),即使是手動關(guān)閉該程序,也不會MessageBox),這樣,是不是會發(fā)生資源泄露呢?難道windows會幫你關(guān)閉?