試験ノート - 実装ドリル
1.0
読み取り中…
検索中…
一致する文字列を見つけられません
comment_only.cpp
1
// =================================
2
// includes
3
// =================================
4
// tip : "mini_db.hpp"
5
// arpa/inet, netinet/in, sys/socket, unistd
6
// cerrno, csignal, cstdlib, cstring
7
// fstream, iostream, sstream, vector
8
9
// =================================
10
// anonymous namespace (TU 限定)
11
// =================================
12
// volatile sig_atomic_t g_running = 1; // SIGINT で 0
13
//
14
// void on_sigint(int)
15
// {
16
// // g_running = 0; // フラグを倒すだけ (signal-safe)
17
// }
18
19
// =================================
20
// main()
21
// =================================
22
// int main(int argc, char **argv)
23
// {
24
// // 引数チェック (argc != 3) / "Wrong number of arguments" -> return 1
25
//
26
// // port = atoi(argv[1]) / 範囲チェック (1..65535)
27
//
28
// // signal(SIGINT, on_sigint)
29
// // signal(SIGPIPE, SIG_IGN)
30
//
31
// // MiniDb server(port, argv[2]);
32
// // server.setup();
33
// // server.run();
34
// // return 0;
35
// }
36
37
// =================================
38
// error
39
// =================================
40
// void fatal(void)
41
// {
42
// // cerr << "Fatal error"
43
// // exit(1)
44
// }
45
46
// =================================
47
// ctor / dtor
48
// =================================
49
50
// MiniDb::MiniDb(int port, const string &path)
51
// : メンバ初期化子で port_, path_ を保存
52
// listen_fd_ = -1, max_fd_ = -1
53
// {
54
// // FD_ZERO(&active_fds_);
55
// // ※ ここでは socket / load は呼ばない (setup() で行う)
56
// }
57
58
// MiniDb::~MiniDb()
59
// {
60
// // buffers_ を走査して全クライアント fd を close
61
// // listen_fd_ >= 0 なら close
62
// // ※ save() はここでは呼ばない (SIGINT 経路で run() の最後)
63
// }
64
65
// =================================
66
// setup() & helper (load)
67
// =================================
68
69
// void MiniDb::setup()
70
// {
71
// // recovery db_ : load()
72
//
73
// // create socket, and error handling
74
// // set socket option for reuse
75
//
76
// // preparation sockaddr_in for bind, and listen
77
// // sockaddr_in : family / sin_addr.s_addr / sin_port
78
// // To bind / listen(128) / fatal
79
// // Tip reinterpret_cast<sockaddr *>(&addr) sockaddr_in * -> sockaddr *
80
//
81
// // set active_fds_ and max_fd_
82
//
83
// // cout << "ready"
84
// }
85
86
// void MiniDb::load()
87
// {
88
// // ifstream(path_) — 開けなければ return
89
// // while (ifs >> key >> value)
90
// // db_[key] = value;
91
// }
92
93
// =================================
94
// run() のメインループ
95
// =================================
96
97
// void MiniDb::run()
98
// {
99
// // while (g_running)
100
// // rfds = active_fds_; // ビット集合を複製
101
// // select(max_fd_+1, &rfds, NULL, NULL, NULL)
102
// // EINTR -> continue
103
// // その他 -> fatal
104
// // for (fd = 0..max_fd_ && rv > 0):
105
// // FD_ISSET でなければ skip
106
// // rv-- : 動きのあったfdのカウントを減らす。
107
// // listen_fd_ -> accept_client()
108
// // else -> recv_data(fd)
109
// //
110
// // ループ脱出後に save(); // SIGINT 安全な場所で永続化
111
// }
112
113
// =================================
114
// accept_client()
115
// =================================
116
117
// void MiniDb::accept_client()
118
// {
119
// // new fd : accept() , 失敗時はfatal()
120
// // update active_fds_
121
// // update max_fd_
122
// // set buffers_[fd] <- ""
123
// }
124
125
// =================================
126
// recv_data() & helper (disconnect)
127
// =================================
128
129
// void MiniDb::recv_data(int fd)
130
// {
131
// // recv to buf[1024] (and return n)
132
//
133
// // error or end case : n <= 0
134
// // end : n < 0 && EINTR -> silent return
135
// // other -> disconnect(fd) return
136
//
137
// // accumulation in the recv buffer
138
// // &acc <- buffer_[fd]
139
// // append : acc <- receve buf
140
//
141
// // <- pos (std::string::size_type)
142
// // loop : execute commands line by line : until nopos (pos = find('\n')
143
// // cut out a line
144
// // erase until '\n'
145
// // handle_command() -> after response string use
146
// // send return string
147
//
148
// // (Leave the rest in buffer_ and wait for the next recv)
149
// }
150
151
// void MiniDb::disconnect(int fd)
152
// {
153
// // ファイルディスクリプタを閉じる
154
// // フィルタ解除 : FD_CLR
155
// // fdで受信したバッファを破棄。
156
// // max_fd_ を巻き戻す (listen_fd_ より下げない)
157
// }
158
159
// =================================
160
// handle_command()
161
// =================================
162
163
// 入出力対応:
164
// POST <k> <v> -> "0\n"
165
// GET <k> (hit) -> "0 <v>\n"
166
// GET <k> (miss) -> "1\n"
167
// DELETE <k> (hit) -> "0\n"
168
// DELETE <k> (miss) -> "1\n"
169
// それ以外 / 空行 -> "2\n"
170
171
// std::string MiniDb::handle_command(const std::string &line)
172
// {
173
// // istringstream でトークン列に分解 (vector<string> tok)
174
// //
175
// // tok.empty() -> "2\n"
176
// // tok[0]=="POST" && size==3 -> db_[k]=v / "0\n"
177
// // tok[0]=="GET" && size==2 -> find / hit "0 v\n" / miss "1\n"
178
// // tok[0]=="DELETE" && size==2 -> erase>0 "0\n" / 0 "1\n"
179
// // それ以外 (引数数不一致を含む) -> "2\n"
180
// }
181
182
// =================================
183
// save()
184
// =================================
185
186
// void MiniDb::save() const
187
// {
188
// // ofstream(path_) — 開けなければ return
189
// // for each db_ entry:
190
// // ofs << key << " " << value << "\n";
191
// }
mini_db
comment_only.cpp
構築:
1.9.8