2.1.2 小试牛刀--模拟实现Windows的TCP程序(4)
④ 循环控制模块
此模块的功能是通过函数LoopControl实现的,具体代码如下:
- /*循环控制函数*/
- int LoopControl(SOCKET listenfd, int isMultiTasking)
- {
- SOCKET acceptfd;
- struct sockaddr_in clientAddr;
- int err;
- int nSize;
- int serverNum = 0;
- HANDLE handles[MAX_SER];
- int myID;
-
- /*服务次数小于最大服务次数*/
- while (serverNum < maxService)
- {
- nSize = sizeof(clientAddr);
- /*接收客户端请求*/
- acceptacceptfd = accept(listenfd, (struct sockaddr *)
- &clientAddr, &nSize);
- /*如果接收失败*/
- if (acceptfd == INVALID_SOCKET)
- {
- ErrorPrint("Error: accept failed\n");
- return 1;
- }
- /*接收成功*/
- printf("Accepted connection from client at %s\n",
- inet_ntoa(clientAddr.sin_addr));
- /*如果允许多任务执行*/
- if (isMultiTasking)
- {
- /*创建一个新线程来执行任务,新线程的初始堆栈大小为1000,线程执行函数
- 是Service(),传递给Service()的参数为acceptfd*/
- handles[serverNum] = CreateThread(NULL, 1000,
- (LPTHREAD_START_ROUTINE)Service,
- (LPVOID) acceptfd, 0, &myID);
-
- }
- else
- /*直接调用服务客户端的函数*/
- Service((LPVOID)acceptfd);
- serverNum++;
- }
-
- if (isMultiTasking)
- {
- /*在一个线程中等待多个事件,当所有对象都被通知时函数才会返回,且等待没有时间限制*/
- err = WaitForMultipleObjects(maxService, handles, TRUE, INFINITE);
- printf("Last thread to finish was thread #%d\n", err);
- }
- return 0;
- }