Skip to content

Commit 31cb406

Browse files
authored
Add setsockopt to TcpServer (#266)
* use std::shared_ptr<std::vector> instead of std::vector for dns cache * Add setsockopt to TcpServer
1 parent d5fcf07 commit 31cb406

File tree

7 files changed

+61
-15
lines changed

7 files changed

+61
-15
lines changed

trantor/net/TcpServer.cc

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,16 @@ TcpServer::~TcpServer()
4747
LOG_TRACE << "TcpServer::~TcpServer [" << serverName_ << "] destructing";
4848
}
4949

50+
void TcpServer::setBeforeListenSockOptCallback(SockOptCallback cb)
51+
{
52+
acceptorPtr_->setBeforeListenSockOptCallback(std::move(cb));
53+
}
54+
55+
void TcpServer::setAfterAcceptSockOptCallback(SockOptCallback cb)
56+
{
57+
acceptorPtr_->setAfterAcceptSockOptCallback(std::move(cb));
58+
}
59+
5060
void TcpServer::newConnection(int sockfd, const InetAddress &peer)
5161
{
5262
LOG_TRACE << "new connection:fd=" << sockfd

trantor/net/TcpServer.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,19 @@ class TRANTOR_EXPORT TcpServer : NonCopyable
160160
writeCompleteCallback_ = std::move(cb);
161161
}
162162

163+
/**
164+
* @brief Set the before listen setsockopt callback.
165+
*
166+
* @param cb This callback will be called before the listen
167+
*/
168+
void setBeforeListenSockOptCallback(SockOptCallback cb);
169+
/**
170+
* @brief Set the after accept setsockopt callback.
171+
*
172+
* @param cb This callback will be called after accept
173+
*/
174+
void setAfterAcceptSockOptCallback(SockOptCallback cb);
175+
163176
/**
164177
* @brief Get the name of the server.
165178
*

trantor/net/inner/Acceptor.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ Acceptor::~Acceptor()
5454
void Acceptor::listen()
5555
{
5656
loop_->assertInLoopThread();
57+
if (beforeListenSetSockOptCallback_)
58+
beforeListenSetSockOptCallback_(sock_.fd());
5759
sock_.listen();
5860
acceptChannel_.enableReading();
5961
}
@@ -64,6 +66,8 @@ void Acceptor::readCallback()
6466
int newsock = sock_.accept(&peer);
6567
if (newsock >= 0)
6668
{
69+
if (afterAcceptSetSockOptCallback_)
70+
afterAcceptSetSockOptCallback_(newsock);
6771
if (newConnectionCallback_)
6872
{
6973
newConnectionCallback_(newsock, peer);

trantor/net/inner/Acceptor.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
namespace trantor
2525
{
2626
using NewConnectionCallback = std::function<void(int fd, const InetAddress &)>;
27+
using AcceptorSockOptCallback = std::function<void(int)>;
2728
class Acceptor : NonCopyable
2829
{
2930
public:
@@ -42,6 +43,16 @@ class Acceptor : NonCopyable
4243
};
4344
void listen();
4445

46+
void setBeforeListenSockOptCallback(AcceptorSockOptCallback cb)
47+
{
48+
beforeListenSetSockOptCallback_ = std::move(cb);
49+
}
50+
51+
void setAfterAcceptSockOptCallback(AcceptorSockOptCallback cb)
52+
{
53+
afterAcceptSetSockOptCallback_ = std::move(cb);
54+
}
55+
4556
protected:
4657
#ifndef _WIN32
4758
int idleFd_;
@@ -52,5 +63,7 @@ class Acceptor : NonCopyable
5263
NewConnectionCallback newConnectionCallback_;
5364
Channel acceptChannel_;
5465
void readCallback();
66+
AcceptorSockOptCallback beforeListenSetSockOptCallback_;
67+
AcceptorSockOptCallback afterAcceptSetSockOptCallback_;
5568
};
5669
} // namespace trantor

trantor/net/inner/AresResolver.cc

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ void AresResolver::onQueryResult(int status,
171171
const ResolverResultsCallback& callback)
172172
{
173173
LOG_TRACE << "onQueryResult " << status;
174-
std::vector<trantor::InetAddress> inets;
174+
auto inets_ptr = std::make_shared<std::vector<trantor::InetAddress>>();
175175
if (result)
176176
{
177177
auto pptr = (struct in_addr**)result->h_addr_list;
@@ -182,25 +182,25 @@ void AresResolver::onQueryResult(int status,
182182
addr.sin_family = AF_INET;
183183
addr.sin_port = 0;
184184
addr.sin_addr = *reinterpret_cast<in_addr*>(*pptr);
185-
inets.emplace_back(trantor::InetAddress{addr});
185+
inets_ptr->emplace_back(trantor::InetAddress{addr});
186186
}
187187
}
188-
if (inets.empty())
188+
if (inets_ptr->empty())
189189
{
190190
struct sockaddr_in addr;
191191
memset(&addr, 0, sizeof addr);
192192
addr.sin_family = AF_INET;
193193
addr.sin_port = 0;
194194
InetAddress inet(addr);
195-
inets.emplace_back(std::move(inet));
195+
inets_ptr->emplace_back(std::move(inet));
196196
}
197197
{
198198
std::lock_guard<std::mutex> lock(globalMutex());
199199
auto& addrItem = globalCache()[hostname];
200-
addrItem.first = inets;
200+
addrItem.first = inets_ptr;
201201
addrItem.second = trantor::Date::date();
202202
}
203-
callback(inets);
203+
callback(*inets_ptr);
204204
}
205205

206206
void AresResolver::onSockCreate(int sockfd, int type)

trantor/net/inner/AresResolver.h

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class AresResolver : public Resolver,
4343
if (timeout_ == 0 ||
4444
cachedAddr.second.after(timeout_) > trantor::Date::date())
4545
{
46-
inet = (cachedAddr.first)[0];
46+
inet = (*cachedAddr.first)[0];
4747
cached = true;
4848
}
4949
}
@@ -75,8 +75,7 @@ class AresResolver : public Resolver,
7575
virtual void resolve(const std::string& hostname,
7676
const ResolverResultsCallback& cb) override
7777
{
78-
bool cached = false;
79-
std::vector<trantor::InetAddress> inets;
78+
std::shared_ptr<std::vector<trantor::InetAddress>> inets_ptr{nullptr};
8079
{
8180
std::lock_guard<std::mutex> lock(globalMutex());
8281
auto iter = globalCache().find(hostname);
@@ -86,14 +85,13 @@ class AresResolver : public Resolver,
8685
if (timeout_ == 0 ||
8786
cachedAddr.second.after(timeout_) > trantor::Date::date())
8887
{
89-
inets = cachedAddr.first;
90-
cached = true;
88+
inets_ptr = cachedAddr.first;
9189
}
9290
}
9391
}
94-
if (cached)
92+
if (inets_ptr)
9593
{
96-
cb(inets);
94+
cb(*inets_ptr);
9795
return;
9896
}
9997
if (loop_->isInLoopThread())
@@ -132,12 +130,14 @@ class AresResolver : public Resolver,
132130
ChannelList channels_;
133131
static std::unordered_map<
134132
std::string,
135-
std::pair<std::vector<InetAddress>, trantor::Date>>&
133+
std::pair<std::shared_ptr<std::vector<trantor::InetAddress>>,
134+
trantor::Date>>&
136135
globalCache()
137136
{
138137
static std::unordered_map<
139138
std::string,
140-
std::pair<std::vector<InetAddress>, trantor::Date>>
139+
std::pair<std::shared_ptr<std::vector<trantor::InetAddress>>,
140+
trantor::Date>>
141141
dnsCache;
142142
return dnsCache;
143143
}

trantor/tests/TcpServerTest.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@ int main()
1717
InetAddress addr(8888);
1818
#endif
1919
TcpServer server(loopThread.getLoop(), addr, "test");
20+
server.setBeforeListenSockOptCallback([](int fd) {
21+
std::cout << "setBeforeListenSockOptCallback:" << fd << std::endl;
22+
});
23+
server.setAfterAcceptSockOptCallback([](int fd) {
24+
std::cout << "afterAcceptSockOptCallback:" << fd << std::endl;
25+
});
2026
server.setRecvMessageCallback(
2127
[](const TcpConnectionPtr &connectionPtr, MsgBuffer *buffer) {
2228
// LOG_DEBUG<<"recv callback!";

0 commit comments

Comments
 (0)