今天在看一本書附的源代碼的時候,發現了一個問題,大家來探討一下:關于Winsock的
下面是兩個程序,一個是服務器端的程序,不斷在監客戶端的連接
另外一個是客戶端的程序,試圖連接服務器端
服務器端的程序代碼:
int main()
{
?// 創建套節字
?SOCKET sListen = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
?if(sListen == INVALID_SOCKET)
?{
??printf("Failed socket() \n");
??return 0;
?}
?
?// 填充sockaddr_in結構
?sockaddr_in sin;
?sin.sin_family = AF_INET;
?sin.sin_port = htons(4567);
?sin.sin_addr.S_un.S_addr = INADDR_ANY;
?
?// 綁定這個套節字到一個本地地址
?if(::bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
?{
??printf("Failed bind() \n");
??return 0;
?}
?
?// 進入監聽模式
?if(::listen(sListen, 2) == SOCKET_ERROR)
?{
??printf("Failed listen() \n");
??return 0;
?}
?
?// 循環接受客戶的連接請求
?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));
??// 向客戶端發送數據
??::send(sClient, szText, strlen(szText), 0);
??// 關閉同客戶端的連接
??::closesocket(sClient);
?}
??
?// 關閉監聽套節字
?::closesocket(sListen);
?::MessageBox(NULL,"","",MB_OK);
?return 0;
}
大家請注意上面的while循環,在不斷監聽客戶端的連接。除非你手動關閉該服務器程序,否則while循環是不會退出的。那么,問題是:關閉套接字的那段代碼始終不會執行(我用MessageBox做了試驗,即使是手動關閉該程序,也不會MessageBox),這樣,是不是會發生資源泄露呢?難道windows會幫你關閉?