Skip to content
This repository was archived by the owner on Apr 27, 2020. It is now read-only.

Commit e0de26f

Browse files
author
7
committed
兼容windows
还有小部分问题
1 parent 3f9c539 commit e0de26f

File tree

3 files changed

+543
-478
lines changed

3 files changed

+543
-478
lines changed

kProxy/kHttpd/kHttpd.cpp

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,13 @@ int kHttpd::listen(int listen_count, unsigned short port, const char* ip) {
114114
#else
115115
int num_ready = poll(poll_fd, list_len + 1, -1);
116116
#endif
117-
if ((num_ready == -1) && (errno == EINTR)) {
117+
if ((num_ready == -1) &&
118+
#ifdef WIN32
119+
(WSAGetLastError() == WSAEINTR)
120+
#else
121+
(errno == EINTR)
122+
#endif
123+
) {
118124
// lock.unlock();
119125
delete[] poll_fd;
120126
continue; //被信号中断,继续等待
@@ -132,11 +138,12 @@ int kHttpd::listen(int listen_count, unsigned short port, const char* ip) {
132138
else if (0 > num_ready) {
133139
for (long int i = list_len - 1; i >= 0; i--) {
134140
#ifdef WIN32
135-
shutdown(socket_fd_list[i], SD_BOTH);
141+
// shutdown(socket_fd_list[i], SD_BOTH);
142+
closesocket(socket_fd_list[i]);
136143
#else
137144
shutdown(socket_fd_list[i], SHUT_RDWR);
138-
#endif
139145
close(socket_fd_list[i]);
146+
#endif
140147
}
141148
socket_fd_list.clear();
142149
delete[] poll_fd;
@@ -145,7 +152,14 @@ int kHttpd::listen(int listen_count, unsigned short port, const char* ip) {
145152
if (poll_fd[list_len].revents > 0) {
146153
int new_fd = kekxv::socket::accept(fd, nullptr, nullptr);
147154
if (new_fd < 0) {
148-
_logger->e(TAG, __LINE__, "Accept error in on_accept()");
155+
_logger->e(TAG, __LINE__, "Accept error in on_accept()");
156+
#ifdef WIN32
157+
_logger->e(TAG, __LINE__, "Accept error WSAGetLastError : %d", WSAGetLastError());
158+
WSADATA wsa;
159+
WSAStartup(MAKEWORD(2, 2), &wsa);
160+
delete[] poll_fd;
161+
return -1;
162+
#endif
149163
}
150164
else {
151165
add_poll_check(new_fd);
@@ -171,11 +185,12 @@ int kHttpd::listen(int listen_count, unsigned short port, const char* ip) {
171185
}
172186
if (_fd > 0) {
173187
#ifdef WIN32
174-
shutdown(_fd, SD_BOTH);
188+
// shutdown(_fd, SD_BOTH);
189+
closesocket(_fd);
175190
#else
176191
shutdown(_fd, SHUT_RDWR);
177-
#endif
178192
close(_fd);
193+
#endif
179194
// self->add_poll_check(_fd);
180195
}
181196
// _logger->d(TAG, __LINE__, "======== client thread end ========");
@@ -188,11 +203,12 @@ int kHttpd::listen(int listen_count, unsigned short port, const char* ip) {
188203
|| poll_fd[i].revents & POLLNVAL
189204
) {
190205
#ifdef WIN32
191-
shutdown(poll_fd[i].fd, SD_BOTH);
206+
// shutdown(poll_fd[i].fd, SD_BOTH);
207+
closesocket(poll_fd[i].fd);
192208
#else
193209
shutdown(poll_fd[i].fd, SHUT_RDWR);
194-
#endif
195210
close(poll_fd[i].fd);
211+
#endif
196212
socket_fd_list.erase(socket_fd_list.begin() + i);
197213
num_ready--;
198214
}

kProxy/kHttpd/kHttpdClient.cpp

Lines changed: 53 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -143,20 +143,22 @@ int kHttpdClient::run() {
143143
if (0 == size) {//说明socket关闭
144144
_logger->w(TAG, __LINE__, "read size is %ld for socket: %d", size, fd);
145145
#ifdef WIN32
146-
shutdown(fd, SD_BOTH);
146+
// shutdown(fd, SD_BOTH);
147+
closesocket(fd);
147148
#else
148149
shutdown(fd, SHUT_RDWR);
149-
#endif
150150
close(fd);
151+
#endif
151152
return 0;
152153
} else if (0 > size && (errno != EINTR && errno != EWOULDBLOCK && errno != EAGAIN)) {
153154
_logger->w(TAG, __LINE__, "read size is %ld for socket: %d is errno:", size, fd, errno);
154155
#ifdef WIN32
155-
shutdown(fd, SD_BOTH);
156+
//shutdown(fd, SD_BOTH);
157+
closesocket(fd);
156158
#else
157159
shutdown(fd, SHUT_RDWR);
158-
#endif
159160
close(fd);
161+
#endif
160162
return 0;
161163
}
162164
if (!data.empty()) {
@@ -173,7 +175,7 @@ int kHttpdClient::run() {
173175
}
174176
}
175177
if (split_index == 0) {
176-
for (long int i = 0; i < size; i++) {
178+
for (long int i = 0; i < size - 3; i++) {
177179
if (buffer[i] == '\r' && buffer[i + 1] == '\n') {
178180
if (buffer[i + 2] == '\r' && buffer[i + 3] == '\n') {
179181
split_index = data.size() + i + 4;
@@ -187,7 +189,7 @@ int kHttpdClient::run() {
187189
}
188190
}
189191
}
190-
data.insert(data.end(), &buffer[0], &buffer[size]);
192+
data.insert(data.end(), buffer.begin(), buffer.end());
191193

192194
} while (split_index == 0);
193195
/********* 初始化http头 *********/
@@ -217,22 +219,24 @@ int kHttpdClient::run() {
217219
if (0 == size) {//说明socket关闭
218220
_logger->w(TAG, __LINE__, "read size is %ld for socket: %d", size, fd);
219221
#ifdef WIN32
220-
shutdown(fd, SD_BOTH);
222+
// shutdown(fd, SD_BOTH);
223+
closesocket(fd);
221224
#else
222225
shutdown(fd, SHUT_RDWR);
223-
#endif
224226
close(fd);
227+
#endif
225228
fd = 0;
226229
return fd;
227230
break;
228231
} else if (0 > size && (errno != EINTR && errno != EWOULDBLOCK && errno != EAGAIN)) {
229232
_logger->w(TAG, __LINE__, "read size is %ld for socket: %d is errno:", size, fd, errno);
230233
#ifdef WIN32
231-
shutdown(fd, SD_BOTH);
234+
//shutdown(fd, SD_BOTH);
235+
closesocket(fd);
232236
#else
233237
shutdown(fd, SHUT_RDWR);
234-
#endif
235238
close(fd);
239+
#endif
236240
fd = 0;
237241
return fd;
238242
break;
@@ -306,7 +310,12 @@ int kHttpdClient::run() {
306310
}
307311
inFile.close();
308312
string type = "*";
309-
type = (char *) filepath.extension().c_str();
313+
#ifdef WIN32
314+
auto _ = filepath.extension();
315+
type = _.string();
316+
#else
317+
type = filepath.extension();
318+
#endif
310319
if (kHttpdClient_HTTP_Content_Type.find(type) == kHttpdClient_HTTP_Content_Type.end())
311320
type = "*";
312321
this->ContentType = kHttpdClient_HTTP_Content_Type[type];
@@ -317,7 +326,7 @@ int kHttpdClient::run() {
317326
} catch (std::exception &e) {
318327
this->response_code = HttpResponseCode::ResponseCode::NotFound;
319328
if (this->ResponseContent.empty()) {
320-
string body = "未找到页面:" + url_path;
329+
string body = string("cann't found ") + url_path;
321330
this->ResponseContent.insert(ResponseContent.begin(), &body.c_str()[0], &body.c_str()[body.size()]);
322331
}
323332
}
@@ -345,7 +354,9 @@ string kHttpdClient::get_localtime(time_t now) {
345354
time(&now); //time函数读取现在的时间(国际标准时间非北京时间),然后传值给now
346355

347356
#ifdef WIN32
348-
char *daytime = ctime(&now);
357+
struct tm tmnow = { 0 };
358+
localtime_s(&tmnow, &now);
359+
char *daytime = asctime(&tmnow);
349360
#else
350361
timenow = localtime(&now);
351362
char daytime[100];
@@ -360,31 +371,35 @@ string kHttpdClient::get_localtime(time_t now) {
360371
void kHttpdClient::init_header(const char *data, unsigned long int size, bool is_split_n) {
361372
unsigned long int offset = 0;
362373
int space_index = 0;
363-
for (; offset < size; offset++) {
364-
if (data[offset] == '\r' && data[offset + 1] == '\n') {
365-
offset += 2;
366-
break;
367-
} else if (data[offset] == '\n') {
368-
offset++;
369-
break;
370-
} else if (data[offset] == ' ') {
371-
space_index++;
372-
}
373-
switch (space_index) {
374-
case 0:
375-
if (!method.empty() || data[offset] != ' ')
376-
method.push_back(data[offset]);
377-
break;
378-
case 1:
379-
if (!url_path.empty() || data[offset] != ' ')
380-
url_path.push_back(data[offset]);
381-
break;
382-
default:
383-
if (!http_version.empty() || data[offset] != ' ')
384-
http_version.push_back(data[offset]);
385-
break;
386-
}
387-
}
374+
if (method.empty()) {
375+
for (; offset < size; offset++) {
376+
if (data[offset] == '\r' && data[offset + 1] == '\n') {
377+
offset += 2;
378+
break;
379+
}
380+
else if (data[offset] == '\n') {
381+
offset++;
382+
break;
383+
}
384+
else if (data[offset] == ' ') {
385+
space_index++;
386+
}
387+
switch (space_index) {
388+
case 0:
389+
if (!method.empty() || data[offset] != ' ')
390+
method.push_back(data[offset]);
391+
break;
392+
case 1:
393+
if (!url_path.empty() || data[offset] != ' ')
394+
url_path.push_back(data[offset]);
395+
break;
396+
default:
397+
if (!http_version.empty() || data[offset] != ' ')
398+
http_version.push_back(data[offset]);
399+
break;
400+
}
401+
}
402+
}
388403
if (method.empty())method = "GET";
389404
if (url_path.empty())url_path = "/";
390405
if (http_version.empty())http_version = "HTTP/1.0";

0 commit comments

Comments
 (0)