Fork me on GitHub

20200826 代码笔记

 

文件1: webServer.h

 1 //#pragma once
 2 #ifndef _WEB_SERVER_H_
 3 #define _WEB_SERVER_H_
 4 
 5 #include <time.h>
 6 
 7 #define MAX_SIZE 1000        
 8 
 9 typedef struct 
10 {
11     int fd;
12     time_t timeout;        //使用超时时刻的时间戳表示
13 }ConnTimeout;            //超时的一个节点元素
14 
15 typedef struct
16 {
17     ConnTimeout* elems;        //顺序表的基地址
18     int length;                //顺序表的长度
19     int size;                //顺序表的空间
20 }TimeoutSqList;
21 
22 //顺序表的接口
23 //初始化
24 bool initList(TimeoutSqList& L);
25 //添加
26 bool listAppend(TimeoutSqList& L, ConnTimeout e);
27 //删除
28 bool listDelete(TimeoutSqList& L, int i);
29 //销毁
30 void destroyList(TimeoutSqList& L);
31 //遍历
32 void listPrint(TimeoutSqList& L);
33 
34 #endif // !_WEB_SERVER_H_

 

文件2: SqList.cpp

 1 #include <iostream>
 2 #include "webServer.h"
 3 
 4 using namespace std;
 5 
 6 //初始化
 7 bool initList(TimeoutSqList& L)            //构造一个空的顺序表L
 8 {
 9     L.elems = new ConnTimeout[MAX_SIZE];
10     if (!L.elems)
11     {
12         return false;
13     }
14     L.length = 0;
15     L.size = MAX_SIZE;
16     return true;
17 
18 }
19 
20 //添加
21 bool listAppend(TimeoutSqList& L, ConnTimeout e)
22 {
23     if (L.length == L.size) return false;        //存储空间已满
24     L.elems[L.length] = e;
25     L.length++;                                    //表长增1
26     return true;
27 }
28 
29 //删除
30 bool listDelete(TimeoutSqList& L, int i)
31 {
32     if (i < 0 || i >= L.length) return false;        //不合法
33     if (i == L.length - 1)                           //删除最后一个元素,直接删除
34     {
35         L.length--;
36         return true;
37     }
38     for (int j = i; j < L.length - 1; j++)
39     {
40         L.elems[j] = L.elems[j + 1];                //被删除元素之后的元素前移
41     }
42     L.length--;
43     return true;
44 }
45 
46 //销毁
47 void destroyList(TimeoutSqList& L)
48 {
49     if (L.elems) delete[]L.elems;//释放存储空间
50     L.length = 0;
51     L.size = 0;
52 }
53 
54 //遍历
55 void listPrint(TimeoutSqList& L)
56 {
57     cout << "当前: " << L.size << ", 已保存元素个数length: " << L.length << endl;
58     for (int j = 0; j <= L.length - 1; j++)
59     {
60         cout << "fd: " << L.elems[j].fd << ", timeout: " << L.elems[j].timeout << endl;
61     }
62     cout << endl;
63 }

 

文件3: webServer.cpp

 1 #include <iostream>
 2 #include <time.h>
 3 #include <Windows.h>
 4 #include "webServer.h"
 5 
 6 using namespace std;
 7 
 8 static void checkTimeouts(TimeoutSqList& list, time_t now);
 9 
10 int main()
11 {
12     time_t now, end;
13     time_t last_timeout;        //
14     TimeoutSqList list;
15 
16 
17     time(&now);            //获取当前时间戳
18     end = now + 60;
19     last_timeout = now;
20 
21     initList(list);
22 
23     for (int i = 0; i < 10; i++)
24     {
25         ConnTimeout e;
26         e.fd = i;
27         e.timeout = now + 5 + 2 * i;
28         listAppend(list, e);
29     }
30 
31     listPrint(list);
32 
33     do
34     {
35         if (last_timeout + 0.999 < now)
36         {
37             checkTimeouts(list, now);        //检查超时的链接
38             last_timeout = now;
39         }
40         Sleep(10);
41         time(&now);
42 
43     } while (now < end);
44 
45 }
46 
47 void checkTimeouts(TimeoutSqList& list, time_t now)
48 {
49     int fd, i;
50     cout << "检查超时fd......\n";
51 
52     for (int i = 0; i < list.length; i++)
53     {
54         if (list.elems[i].timeout > now)
55         {
56             continue;
57         }
58 
59         //超时,清理链接
60         fd = list.elems[i].fd;
61         //关闭链接
62         printf("关闭链接[fd = %d] 已经超时,关闭链接! \n", fd);
63 
64         //删除顺序表中的元素
65         listDelete(list, i);
66         //循环完了后会i++, 删除元素时注意元素下标,不i--会删错
67         i--;                
68     }
69 }

 

posted @ 2020-08-26 00:23  索智源  阅读(148)  评论(0编辑  收藏  举报