File tree Expand file tree Collapse file tree 6 files changed +60
-0
lines changed Expand file tree Collapse file tree 6 files changed +60
-0
lines changed Original file line number Diff line number Diff line change @@ -133,6 +133,16 @@ void TcpClient::stop()
133
133
connector_->stop ();
134
134
}
135
135
136
+ void TcpClient::setSockOptCallback (SockOptCallback &&cb)
137
+ {
138
+ connector_->setSockOptCallback (std::move (cb));
139
+ }
140
+
141
+ void TcpClient::setSockOptCallback (const SockOptCallback &cb)
142
+ {
143
+ connector_->setSockOptCallback (cb);
144
+ }
145
+
136
146
void TcpClient::newConnection (int sockfd)
137
147
{
138
148
loop_->assertInLoopThread ();
Original file line number Diff line number Diff line change @@ -190,6 +190,13 @@ class TRANTOR_EXPORT TcpClient : NonCopyable,
190
190
sslErrorCallback_ = std::move (cb);
191
191
}
192
192
193
+ /* *
194
+ * @brief Set the callback for set socket option
195
+ * @param cb The callback is called, before connect
196
+ */
197
+ void setSockOptCallback (const SockOptCallback &cb);
198
+ void setSockOptCallback (SockOptCallback &&cb);
199
+
193
200
/* *
194
201
* @brief Enable SSL encryption.
195
202
* @param useOldTLS If true, the TLS 1.0 and 1.1 are supported by the
Original file line number Diff line number Diff line change @@ -40,5 +40,6 @@ using WriteCompleteCallback = std::function<void(const TcpConnectionPtr &)>;
40
40
using HighWaterMarkCallback =
41
41
std::function<void (const TcpConnectionPtr &, const size_t )>;
42
42
using SSLErrorCallback = std::function<void (SSLError)>;
43
+ using SockOptCallback = std::function<void (int )>;
43
44
44
45
} // namespace trantor
Original file line number Diff line number Diff line change @@ -79,6 +79,8 @@ void Connector::connect()
79
79
{
80
80
socketHanded_ = false ;
81
81
fd_ = Socket::createNonblockingSocketOrDie (serverAddr_.family ());
82
+ if (sockOptCallback_)
83
+ sockOptCallback_ (fd_);
82
84
errno = 0 ;
83
85
int ret = Socket::connect (fd_, serverAddr_);
84
86
int savedErrno = (ret == 0 ) ? 0 : errno;
Original file line number Diff line number Diff line change @@ -28,6 +28,7 @@ class Connector : public NonCopyable,
28
28
public:
29
29
using NewConnectionCallback = std::function<void (int sockfd)>;
30
30
using ConnectionErrorCallback = std::function<void ()>;
31
+ using SockOptCallback = std::function<void (int sockfd)>;
31
32
Connector (EventLoop *loop, const InetAddress &addr, bool retry = true );
32
33
Connector (EventLoop *loop, InetAddress &&addr, bool retry = true );
33
34
~Connector ();
@@ -47,6 +48,14 @@ class Connector : public NonCopyable,
47
48
{
48
49
errorCallback_ = std::move (cb);
49
50
}
51
+ void setSockOptCallback (const SockOptCallback &cb)
52
+ {
53
+ sockOptCallback_ = cb;
54
+ }
55
+ void setSockOptCallback (SockOptCallback &&cb)
56
+ {
57
+ sockOptCallback_ = std::move (cb);
58
+ }
50
59
const InetAddress &serverAddress () const
51
60
{
52
61
return serverAddr_;
@@ -58,6 +67,7 @@ class Connector : public NonCopyable,
58
67
private:
59
68
NewConnectionCallback newConnectionCallback_;
60
69
ConnectionErrorCallback errorCallback_;
70
+ SockOptCallback sockOptCallback_;
61
71
enum class Status
62
72
{
63
73
Disconnected,
Original file line number Diff line number Diff line change 4
4
#include < string>
5
5
#include < iostream>
6
6
#include < atomic>
7
+ #ifdef _WIN32
8
+ #include < ws2tcpip.h>
9
+ #else
10
+ #include < sys/socket.h>
11
+ #include < netinet/tcp.h>
12
+ #endif
13
+
7
14
using namespace trantor ;
8
15
#define USE_IPV6 0
9
16
int main ()
@@ -24,6 +31,29 @@ int main()
24
31
client[i] = std::make_shared<trantor::TcpClient>(&loop,
25
32
serverAddr,
26
33
" tcpclienttest" );
34
+ client[i]->setSockOptCallback ([](int fd) {
35
+ LOG_DEBUG << " setSockOptCallback!" ;
36
+ #ifdef _WIN32
37
+ #elif __linux__
38
+ int optval = 10 ;
39
+ ::setsockopt (fd,
40
+ SOL_TCP,
41
+ TCP_KEEPCNT,
42
+ &optval,
43
+ static_cast <socklen_t >(sizeof optval));
44
+ ::setsockopt (fd,
45
+ SOL_TCP,
46
+ TCP_KEEPIDLE,
47
+ &optval,
48
+ static_cast <socklen_t >(sizeof optval));
49
+ ::setsockopt (fd,
50
+ SOL_TCP,
51
+ TCP_KEEPINTVL,
52
+ &optval,
53
+ static_cast <socklen_t >(sizeof optval));
54
+ #else
55
+ #endif
56
+ });
27
57
client[i]->setConnectionCallback (
28
58
[i, &loop, &connCount](const TcpConnectionPtr &conn) {
29
59
if (conn->connected ())
You can’t perform that action at this time.
0 commit comments