Skip to content

Commit 3e6fdc9

Browse files
author
unknown
committed
windows support
1 parent d5a217d commit 3e6fdc9

17 files changed

+322
-93
lines changed

CMakeLists.txt

+19-7
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,22 @@
11
cmake_minimum_required(VERSION 3.2)
2-
set(CMAKE_VERBOSE_MAKEFILE ON)
3-
42
set(projectName enjoycnet)
53

64
project(${projectName})
75

6+
# build config
7+
set(CMAKE_CXX_STANDARD 17)
8+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
9+
set(CMAKE_VERBOSE_MAKEFILE ON)
10+
11+
#
12+
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
13+
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
14+
set(BUILD_SHARED_LIBS "Build shared libs" OFF)
15+
16+
817
if (CMAKE_BUILD_TYPE)
918
else()
1019
set(CMAKE_BUILD_TYPE RelWithDebInfo)
11-
#set(CMAKE_BUILD_TYPE DEBUG)
1220
endif()
1321

1422

@@ -44,13 +52,17 @@ else()
4452
EXIT()
4553
endif()
4654

47-
# add include and lib other project
48-
include_directories(${PROJECT_SOURCE_DIR}/3rdparty/install/include)
55+
#include
4956
include_directories(${Boost_INCLUDE_DIRS})
57+
include_directories(${PROJECT_SOURCE_DIR})
58+
include_directories(${PROJECT_SOURCE_DIR}/3rdparty/install/include)
59+
60+
#lib
5061
link_directories(${PROJECT_SOURCE_DIR}/3rdparty/install/lib)
62+
link_directories(${PROJECT_BINARY_DIR}/lib)
63+
link_directories(${Boost_LIBRARY_DIRS})
64+
5165

52-
# add my project .h and .cpp
53-
include_directories(${PROJECT_SOURCE_DIR})
5466

5567
add_subdirectory(enjoycnet)
5668
add_subdirectory(test)

enjoycnet/CMakeLists.txt

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
project(enjoycnet)
22

3-
43
macro(add_src_dir name)
54
file(GLOB SRC_LIST ${name}/*.h ${name}/*.cpp)
65
if(WIN32)
@@ -13,7 +12,7 @@ endmacro()
1312
add_src_dir(core)
1413

1514
set(TARGET ${projectName})
16-
add_library(${TARGET} ${SRC_LIST} )
15+
add_library(${TARGET} STATIC ${SRC_LIST} )
1716
install(TARGETS ${TARGET} LIBRARY DESTINATION "lib" ARCHIVE DESTINATION "lib")
1817
install(DIRECTORY ${PROJECT_SOURCE_DIR} DESTINATION "include" FILES_MATCHING PATTERN "*.h")
1918

enjoycnet/all.h

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#include "core/syscall.h"
12
#include "core/io_context.h"
23
#include "core/co_event.h"
34
#include "core/socket.h"

enjoycnet/core/co_event.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ namespace enjoyc
2424

2525
CoEvent::~CoEvent()
2626
{
27-
assert(read_co_ == nullptr and write_co_ == nullptr);
27+
assert(read_co_ == nullptr && write_co_ == nullptr);
2828
DLOG(INFO) << __FUNCTION__ << " " << this;
2929
read_wathcer_.stop();
3030
write_wathcer_.stop();
@@ -48,6 +48,7 @@ namespace enjoyc
4848
assert(write_co_ == nullptr);
4949
write_wathcer_.start();
5050
write_co_ = co::CoroutineContext::this_coroutine();
51+
LOG(INFO) << __FUNCTION__ << " co is " << write_co_;
5152
CO_YIELD;
5253
}
5354
// cb from libev
@@ -63,7 +64,7 @@ namespace enjoyc
6364

6465
void CoEvent::write_cb(ev::io &w, int revents)
6566
{
66-
67+
LOG(INFO) << __FUNCTION__;
6768
assert(write_co_ != nullptr);
6869
write_wathcer_.stop();
6970
START(std::exchange(write_co_, nullptr));

enjoycnet/core/codec.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ namespace enjoyc
1414
public:
1515
using ReadCallback = std::function<void(Res&)>;
1616

17-
virtual uint32_t parse_message(const char* data, uint32_t len) = 0;
17+
virtual size_t parse_message(const char* data, uint32_t len) = 0;
1818

1919
};
2020

@@ -30,7 +30,7 @@ namespace enjoyc
3030

3131
}
3232

33-
virtual uint32_t parse_message(const char* data, uint32_t len) override
33+
virtual size_t parse_message(const char* data, uint32_t len) override
3434
{
3535

3636
auto handled = request_.PartailParse(data, len);
@@ -59,7 +59,7 @@ namespace enjoyc
5959
read_callback_(read_callback)
6060
{}
6161

62-
uint32_t parse_message(const char* data, uint32_t len)
62+
size_t parse_message(const char* data, uint32_t len)
6363
{
6464

6565
auto handled = response_.PartailParse(data, len);

enjoycnet/core/connection.h

+20-10
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,9 @@ namespace enjoyc
5757

5858
// read at one time at this thread!
5959
// the readcb can not invoke read
60-
assert((state_ & S_READ) == 0 and io_context_->is_in_create_thread());
60+
assert((state_ & S_READ) == 0 && io_context_->is_in_create_thread());
6161
state_ |= S_READ;
62-
uint32_t read_buffer_size = read_buffer_.size();
62+
size_t read_buffer_size = read_buffer_.size();
6363
ssize_t n = socket_.read(&read_buffer_[read_buffer_pos_],
6464
read_buffer_size - read_buffer_pos_);
6565

@@ -94,10 +94,10 @@ namespace enjoyc
9494
return false;
9595
}
9696

97-
read_buffer_.resize(std::min(read_buffer_size * 2, (uint32_t)READ_BUFFER_MAX_SIZE_LIMIT));
97+
read_buffer_.resize(min(read_buffer_size * 2, (uint32_t)READ_BUFFER_MAX_SIZE_LIMIT));
9898
}
9999
//shrink
100-
else if(read_buffer_size > READ_BUFFER_SHRINK_SIZE * 1.5 and
100+
else if(read_buffer_size > READ_BUFFER_SHRINK_SIZE * 1.5 &&
101101
read_buffer_pos_ < READ_BUFFER_SHRINK_SIZE * 0.5)
102102
{
103103
read_buffer_.resize(READ_BUFFER_SHRINK_SIZE);
@@ -153,7 +153,7 @@ namespace enjoyc
153153

154154
if((state_ & S_WRITE) != 0)
155155
{
156-
if(not write_to_buffer(data, len))
156+
if(!write_to_buffer(data, len))
157157
{
158158
close();
159159
}
@@ -167,7 +167,7 @@ namespace enjoyc
167167
if(len > WRITE_ONCE_MAX_SIZE)
168168
{
169169
auto write_size = len - WRITE_ONCE_MAX_SIZE;
170-
if(not write_to_buffer(data + WRITE_ONCE_MAX_SIZE, write_size))
170+
if(!write_to_buffer(data + WRITE_ONCE_MAX_SIZE, write_size))
171171
{
172172
close();
173173
return;
@@ -184,18 +184,28 @@ namespace enjoyc
184184
}
185185

186186
//not write clean or write_buffer has data
187-
while(n != len or write_buffer_pos_ > 0)
187+
while(n != len || write_buffer_pos_ > 0)
188188
{
189189
uint32_t left_len = len - n;
190-
uint32_t buffer_len = std::min((unsigned int)WRITE_ONCE_MAX_SIZE - left_len, write_buffer_pos_);
191-
190+
uint32_t buffer_len = min((unsigned int)WRITE_ONCE_MAX_SIZE - left_len, write_buffer_pos_);
191+
#ifdef _WIN32
192+
char* write_data = (char*)_alloca(left_len + buffer_len);
193+
194+
(void)memcmp(write_data, data + n, left_len);
195+
read_from_buffer(write_data + left_len, buffer_len);
196+
197+
len = left_len + buffer_len;
198+
n = socket_.write((const char*)write_data, len);
199+
#else
200+
192201
char write_data[left_len + buffer_len];
193202

194203
(void)memcmp(&write_data[0], data + n, left_len);
195204
read_from_buffer(&write_data[left_len], buffer_len);
196205

197206
len = left_len + buffer_len;
198207
n = socket_.write((const char*)&write_data, len);
208+
#endif
199209
}
200210

201211
state_ &= ~S_WRITE;
@@ -228,7 +238,7 @@ namespace enjoyc
228238
return false;
229239
}
230240

231-
write_buffer_.resize(std::min(buffer_len * 2, (unsigned long)WRITE_BUFFER_MAX_SIZE_LIMIT));
241+
write_buffer_.resize(min(buffer_len * 2, (unsigned long)WRITE_BUFFER_MAX_SIZE_LIMIT));
232242
}
233243

234244
memcpy(&write_buffer_[write_buffer_pos_], data, len);

enjoycnet/core/connector.h

+7-1
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,14 @@ namespace enjoyc
2424
bool connect(Endpoint & ep)
2525
{
2626
Socket<Proto> socket;
27-
socket.connect(ep);
27+
auto ret = socket.connect(ep);
28+
if (ret < 0)
29+
{
30+
return false;
31+
}
2832
callback_(socket);
33+
34+
return true;
2935
}
3036

3137
private:

enjoycnet/core/endpoint.h

+7-4
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
#pragma once
22
#include <string>
3-
#include <arpa/inet.h>
3+
44
#include <ostream>
55
#include <cstring>
66

7+
#include "syscall.h"
8+
79
namespace enjoyc
810
{
911
namespace net
@@ -16,8 +18,9 @@ namespace enjoyc
1618
:ip_(ip),
1719
port_(port)
1820
{
21+
memset(&addr_, 0, sizeof(sockaddr_in));
1922
addr_.sin_family = AF_INET;
20-
inet_pton(AF_INET, ip_.data(), &(addr_.sin_addr));
23+
inet_pton(AF_INET, ip_.c_str(), &(addr_.sin_addr));
2124
addr_.sin_port = htons(port_);
2225
}
2326

@@ -30,7 +33,7 @@ namespace enjoyc
3033

3134
socklen_t sockadr_size()
3235
{
33-
return sizeof(addr_);
36+
return sizeof(struct sockaddr_in);
3437
}
3538

3639
void calc_ipport_from_addr()
@@ -50,7 +53,7 @@ namespace enjoyc
5053
}
5154

5255
public:
53-
sockaddr_in addr_;
56+
struct sockaddr_in addr_;
5457

5558
std::string ip_;
5659
uint16_t port_;

enjoycnet/core/hook_syscall.h

+38-19
Original file line numberDiff line numberDiff line change
@@ -12,34 +12,54 @@ namespace enjoyc
1212
int accept_hook(int fd, struct sockaddr* sockaddr, socklen_t* len)
1313
{
1414
auto co_event = ThreadContext::this_io_context()->get_coevent(fd);
15-
DLOG(INFO) << __FUNCTION__ << " co_event " << co_event <<" with fd " << fd;
15+
LOG(INFO) << __FUNCTION__ << " co_event " << co_event <<" with fd " << fd;
1616
co_event->wait_read();
17-
return ::accept(fd, sockaddr, len);
17+
18+
LOG(INFO) << __FUNCTION__ << " co_event " << co_event << " with fd " << fd << " can read ";
19+
return accept_syscall(fd, sockaddr, len);
1820
}
1921

2022
int connect_hook(int fd, struct sockaddr* sockaddr, socklen_t len)
2123
{
24+
// must call connect_syscall first£¬ otherwise there's no wriable event can be polled
25+
int ret = 0;
26+
do
27+
{
28+
ret = connect_syscall(fd, sockaddr, len);
29+
} while (ret < 0 && CHECK_ERROR(sys_errno(), EINTR));
30+
31+
if (ret < 0)
32+
{
33+
int err = sys_errno();
34+
while (CHECK_ERROR(err, EWOULDBLOCK) || CHECK_ERROR(err, EINPROGRESS))
35+
{
36+
auto co_event = ThreadContext::this_io_context()->get_coevent(fd);
37+
co_event->wait_write();
38+
err = get_socket_error_syscall(fd);
39+
LOG(INFO) << " err is " << err;
40+
if (err == 0)
41+
return err;
42+
}
43+
}
44+
45+
return ret;
2246

23-
auto co_event = ThreadContext::this_io_context()->get_coevent(fd);
24-
DLOG(INFO) << __FUNCTION__ << " co_event " << co_event <<" with fd " << fd;
25-
co_event->wait_write();
26-
return ::connect(fd, sockaddr, len);
2747
}
2848

2949
ssize_t read_hook(int fd, const char* data, uint32_t len)
3050
{
3151

3252
auto co_event = ThreadContext::this_io_context()->get_coevent(fd);
3353

34-
DLOG(INFO) << __FUNCTION__ << " co_event " << co_event <<" with fd " << fd;
54+
DLOG(INFO) << __FUNCTION__ << " co_event " << co_event << " with fd " << fd;
3555
co_event->wait_read();
3656
ssize_t read_size = 0;
3757
do
3858
{
39-
read_size = ::recv(fd, (void*)data, len, MSG_NOSIGNAL);
40-
}while(read_size < 0 and (errno == EWOULDBLOCK or errno == EINTR));
41-
42-
DLOG(INFO) << __FUNCTION__ << " co_event " << co_event <<" with fd " << fd << " size is " << read_size;
59+
recv_syscall(fd, data, len, read_size);
60+
} while (read_size < 0 && (errno == EWOULDBLOCK || errno == EINTR));
61+
62+
DLOG(INFO) << __FUNCTION__ << " co_event " << co_event << " with fd " << fd << " size is " << read_size;
4363
return read_size;
4464
}
4565

@@ -48,25 +68,24 @@ namespace enjoyc
4868
ssize_t write_size = 0;
4969

5070
//try to syswrite first
51-
do{
52-
53-
write_size= ::send(fd, (void*)data, len, MSG_NOSIGNAL);
71+
do {
72+
send_syscall(fd, data, len, write_size);
5473

55-
}while(write_size < 0 and (errno == EINTR));
56-
if(write_size >= 0)
74+
} while (write_size < 0 && (errno == EINTR));
75+
if (write_size >= 0)
5776
{
5877
return write_size;
5978
}
6079

6180
//try co_event
6281
auto co_event = ThreadContext::this_io_context()->get_coevent(fd);
63-
DLOG(INFO) << __FUNCTION__ << " co_event " << co_event <<" with fd " << fd;
82+
DLOG(INFO) << __FUNCTION__ << " co_event " << co_event << " with fd " << fd;
6483
co_event->wait_write();
6584

6685
do
6786
{
68-
write_size= ::send(fd, (void*)data, len, MSG_NOSIGNAL);
69-
}while(write_size < 0 and (errno == EWOULDBLOCK or errno == EINTR));
87+
send_syscall(fd, data, len, write_size);
88+
} while (write_size < 0 && (errno == EWOULDBLOCK || errno == EINTR));
7089

7190
return write_size;
7291
}

enjoycnet/core/io_context.cpp

-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
#include "io_context.h"
2-
#include <glog/logging.h>
32

43
namespace enjoyc
54
{

enjoycnet/core/io_context.h

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
#pragma once
22

3+
//defined for windows, otherwise glog will failed
4+
#ifndef GLOG_NO_ABBREVIATED_SEVERITIES
5+
#define GLOG_NO_ABBREVIATED_SEVERITIES
6+
#endif
7+
38
#include <thread>
49
#include <mutex>
510
#include <vector>
@@ -53,7 +58,7 @@ namespace enjoyc
5358
}
5459

5560
public:
56-
inline void run()
61+
void run()
5762
{
5863
ev_loop_->run();
5964
}

0 commit comments

Comments
 (0)