大家看一下这个问题

今天在看一本书附的源代码的时候,发现了一个问题,大家来探讨一下:关于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会帮你关闭?

posted on 2006-06-10 20:17 bo 阅读(843) 评论(3)  编辑 收藏 引用 所属分类: Network

评论

# re: 大家看一下这个问题 2006-06-10 21:42 LOGOS

程序关闭后,他所占用的内存空间会被系统回收。
不过我不能确定sListen是否会被关闭  回复  更多评论   

# re: 大家看一下这个问题 2006-06-11 09:37 从头再来

为什么不开一个线程去循环接受客户的连接请求?目前的情况下,就是关闭了同客户端的连接,也不会退出while循环的,不退出循环怎么会继续下面的messagebox()?

  回复  更多评论   

# re: 大家看一下这个问题 2006-06-11 12:20 cooelaf

用异步socket AcceptEx来接受连接.  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2006年3月>
2627281234
567891011
12131415161718
19202122232425
2627282930311
2345678

导航

统计

常用链接

留言簿(4)

随笔分类(23)

随笔档案(23)

URL

最新随笔

搜索

积分与排名

最新随笔

最新评论

阅读排行榜

评论排行榜