2.1.2 小试牛刀--模拟实现Windows的TCP程序(4)

2013-10-07 15:53:51 · 作者: · 浏览: 88

2.1.2  小试牛刀--模拟实现Windows的TCP程序(4)

④ 循环控制模块

此模块的功能是通过函数LoopControl实现的,具体代码如下:

  1. /*循环控制函数*/  
  2. int LoopControl(SOCKET listenfd, int isMultiTasking)  
  3. {  
  4. SOCKET acceptfd;  
  5. struct sockaddr_in clientAddr;  
  6. int err;  
  7. int nSize;  
  8. int serverNum = 0;  
  9. HANDLE handles[MAX_SER];  
  10. int myID;  
  11.  
  12. /*服务次数小于最大服务次数*/  
  13. while (serverNum < maxService)  
  14. {  
  15. nSize = sizeof(clientAddr);  
  16. /*接收客户端请求*/  
  17. acceptacceptfd = accept(listenfd, (struct sockaddr *)  
  18.                          &clientAddr, &nSize);  
  19. /*如果接收失败*/  
  20. if (acceptfd == INVALID_SOCKET)  
  21. {  
  22. ErrorPrint("Error: accept failed\n");  
  23. return 1;  
  24. }  
  25. /*接收成功*/  
  26. printf("Accepted connection from client at %s\n",  
  27.              inet_ntoa(clientAddr.sin_addr));  
  28. /*如果允许多任务执行*/  
  29. if (isMultiTasking)   
  30. {  
  31. /*创建一个新线程来执行任务,新线程的初始堆栈大小为1000,线程执行函数  
  32. 是Service(),传递给Service()的参数为acceptfd*/  
  33. handles[serverNum] = CreateThread(NULL, 1000,  
  34.                       (LPTHREAD_START_ROUTINE)Service,  
  35.                       (LPVOID) acceptfd, 0, &myID);  
  36.  
  37. }  
  38. else  
  39. /*直接调用服务客户端的函数*/  
  40. Service((LPVOID)acceptfd);  
  41. serverNum++;  
  42. }  
  43.  
  44. if (isMultiTasking)  
  45. {  
  46. /*在一个线程中等待多个事件,当所有对象都被通知时函数才会返回,且等待没有时间限制*/  
  47. err = WaitForMultipleObjects(maxService, handles, TRUE, INFINITE);  
  48. printf("Last thread to finish was thread #%d\n", err);  
  49. }  
  50. return 0;  
  51. }