Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
Z
ZLMediaKit
概览
Overview
Details
Activity
Cycle Analytics
版本库
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
问题
0
Issues
0
列表
Board
标记
里程碑
合并请求
0
Merge Requests
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
Snippets
成员
Collapse sidebar
Close sidebar
活动
图像
聊天
创建新问题
作业
提交
Issue Boards
Open sidebar
张翔宇
ZLMediaKit
Commits
94806b2c
Commit
94806b2c
authored
5 years ago
by
xiongziliang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
初步实现hls播放器个数计数
parent
20d56b71
隐藏空白字符变更
内嵌
并排
正在显示
19 个修改的文件
包含
111 行增加
和
60 行删除
+111
-60
.gitignore
+7
-2
server/FFmpegSource.cpp
+8
-0
server/FFmpegSource.h
+2
-0
src/Common/MediaSource.cpp
+7
-0
src/Common/MediaSource.h
+6
-1
src/Common/MultiMediaSourceMuxer.h
+7
-2
src/Http/HttpCookieManager.cpp
+2
-2
src/Http/HttpCookieManager.h
+2
-4
src/Http/HttpFileManager.cpp
+18
-4
src/Player/PlayerProxy.cpp
+10
-6
src/Player/PlayerProxy.h
+5
-8
src/Record/MP4Reader.cpp
+7
-3
src/Record/MP4Reader.h
+4
-13
src/Rtmp/RtmpMediaSourceImp.h
+5
-5
src/Rtmp/RtmpSession.cpp
+6
-2
src/Rtmp/RtmpSession.h
+4
-1
src/Rtsp/RtspMediaSourceImp.h
+4
-4
src/Rtsp/RtspSession.cpp
+5
-2
src/Rtsp/RtspSession.h
+2
-1
没有找到文件。
.gitignore
查看文件 @
94806b2c
...
...
@@ -32,6 +32,12 @@
*.DS_Store
/cmake-build-debug/
/cmake-build-release/
/linux/
/.vs/
/.idea/
/c_wrapper/.idea/
/release/mac/Debug/
\ No newline at end of file
/release/
/Android/.idea/
/Android/app/src/main/cpp/libs_export/
/3rdpart/media-server/.idea/
This diff is collapsed.
Click to expand it.
server/FFmpegSource.cpp
查看文件 @
94806b2c
...
...
@@ -232,6 +232,14 @@ void FFmpegSource::onNoneReader(MediaSource &sender) {
}
}
int
FFmpegSource
::
totalReaderCount
(
MediaSource
&
sender
)
{
auto
listener
=
_listener
.
lock
();
if
(
listener
){
return
listener
->
totalReaderCount
(
sender
);
}
return
0
;
}
void
FFmpegSource
::
onGetMediaSource
(
const
MediaSource
::
Ptr
&
src
)
{
_listener
=
src
->
getListener
();
src
->
setListener
(
shared_from_this
());
...
...
This diff is collapsed.
Click to expand it.
server/FFmpegSource.h
查看文件 @
94806b2c
...
...
@@ -57,8 +57,10 @@ private:
void
startTimer
(
int
timeout_ms
);
void
onGetMediaSource
(
const
MediaSource
::
Ptr
&
src
);
//MediaSourceEvent override
bool
close
(
MediaSource
&
sender
,
bool
force
)
override
;
void
onNoneReader
(
MediaSource
&
sender
)
override
;
int
totalReaderCount
(
MediaSource
&
sender
)
override
;
private
:
Process
_process
;
Timer
::
Ptr
_timer
;
...
...
This diff is collapsed.
Click to expand it.
src/Common/MediaSource.cpp
查看文件 @
94806b2c
...
...
@@ -98,6 +98,13 @@ const std::weak_ptr<MediaSourceEvent>& MediaSource::getListener() const{
return
_listener
;
}
int
MediaSource
::
totalReaderCount
(){
auto
listener
=
_listener
.
lock
();
if
(
!
listener
){
return
readerCount
();
}
return
listener
->
totalReaderCount
(
*
this
);
}
bool
MediaSource
::
seekTo
(
uint32_t
ui32Stamp
)
{
auto
listener
=
_listener
.
lock
();
if
(
!
listener
){
...
...
This diff is collapsed.
Click to expand it.
src/Common/MediaSource.h
查看文件 @
94806b2c
...
...
@@ -67,6 +67,9 @@ public:
// 通知无人观看
virtual
void
onNoneReader
(
MediaSource
&
sender
);
// 观看总人数
virtual
int
totalReaderCount
(
MediaSource
&
sender
)
=
0
;
};
class
MediaInfo
{
...
...
@@ -124,8 +127,10 @@ public:
void
setTrackSource
(
const
std
::
weak_ptr
<
TrackSource
>
&
track_src
);
// 设置监听者
virtual
void
setListener
(
const
std
::
weak_ptr
<
MediaSourceEvent
>
&
listener
);
//
获取观看者个
数
//
本协议获取观看者个数,可能返回本协议的观看人数,也可能返回总人
数
virtual
int
readerCount
()
=
0
;
// 观看者个数,包括(hls/rtsp/rtmp)
virtual
int
totalReaderCount
();
// 获取流当前时间戳
virtual
uint32_t
getTimeStamp
(
TrackType
trackType
)
=
0
;
...
...
This diff is collapsed.
Click to expand it.
src/Common/MultiMediaSourceMuxer.h
查看文件 @
94806b2c
...
...
@@ -30,6 +30,7 @@
#include "Rtsp/RtspMediaSourceMuxer.h"
#include "Rtmp/RtmpMediaSourceMuxer.h"
#include "Record/Recorder.h"
#include "Record/HlsManager.h"
class
MultiMediaSourceMuxer
:
public
MediaSink
,
public
std
::
enable_shared_from_this
<
MultiMediaSourceMuxer
>
{
public
:
...
...
@@ -64,6 +65,9 @@ public:
Recorder
::
startRecord
(
Recorder
::
type_mp4
,
vhost
,
strApp
,
strId
,
true
,
false
);
}
_get_hls_player
=
[
vhost
,
strApp
,
strId
](){
return
HlsManager
::
Instance
().
hlsPlayerCount
(
vhost
,
strApp
,
strId
);
};
}
virtual
~
MultiMediaSourceMuxer
(){}
...
...
@@ -96,8 +100,8 @@ public:
* 返回总的消费者个数
* @return
*/
int
r
eaderCount
()
const
{
return
(
_rtsp
?
_rtsp
->
readerCount
()
:
0
)
+
(
_rtmp
?
_rtmp
->
readerCount
()
:
0
);
int
totalR
eaderCount
()
const
{
return
(
_rtsp
?
_rtsp
->
readerCount
()
:
0
)
+
(
_rtmp
?
_rtmp
->
readerCount
()
:
0
)
+
_get_hls_player
()
;
}
void
setTimeStamp
(
uint32_t
stamp
){
...
...
@@ -157,6 +161,7 @@ private:
RtmpMediaSourceMuxer
::
Ptr
_rtmp
;
RtspMediaSourceMuxer
::
Ptr
_rtsp
;
Listener
*
_listener
=
nullptr
;
function
<
int
()
>
_get_hls_player
;
};
...
...
This diff is collapsed.
Click to expand it.
src/Http/HttpCookieManager.cpp
查看文件 @
94806b2c
...
...
@@ -76,8 +76,8 @@ bool HttpServerCookie::isExpired() {
return
_ticker
.
elapsedTime
()
>
_max_elapsed
*
1000
;
}
std
::
shared_ptr
<
lock_guard
<
mutex
>
>
HttpServerCookie
::
getLock
(){
return
std
::
make_shared
<
lock_guard
<
mutex
>
>
(
_mtx
);
std
::
shared_ptr
<
lock_guard
<
recursive_
mutex
>
>
HttpServerCookie
::
getLock
(){
return
std
::
make_shared
<
lock_guard
<
recursive_
mutex
>
>
(
_mtx
);
}
string
HttpServerCookie
::
cookieExpireTime
()
const
{
...
...
This diff is collapsed.
Click to expand it.
src/Http/HttpCookieManager.h
查看文件 @
94806b2c
...
...
@@ -108,9 +108,7 @@ public:
* 获取区域锁
* @return
*/
std
::
shared_ptr
<
lock_guard
<
mutex
>
>
getLock
();
std
::
shared_ptr
<
lock_guard
<
recursive_mutex
>
>
getLock
();
private
:
string
cookieExpireTime
()
const
;
private
:
...
...
@@ -119,7 +117,7 @@ private:
string
_cookie_uuid
;
uint64_t
_max_elapsed
;
Ticker
_ticker
;
mutex
_mtx
;
recursive_
mutex
_mtx
;
std
::
weak_ptr
<
HttpCookieManager
>
_manager
;
};
...
...
This diff is collapsed.
Click to expand it.
src/Http/HttpFileManager.cpp
查看文件 @
94806b2c
...
...
@@ -32,6 +32,7 @@
#include "HttpFileManager.h"
#include "Util/File.h"
#include "HttpSession.h"
#include "Record/HlsManager.h"
namespace
mediakit
{
...
...
@@ -44,6 +45,7 @@ static const string kCookiePathKey = "kCookiePathKey";
static
const
string
kAccessErrKey
=
"kAccessErrKey"
;
static
const
string
kAccessHls
=
"kAccessHls"
;
static
const
string
kHlsSuffix
=
"/hls.m3u8"
;
static
const
string
kHlsData
=
"kHlsData"
;
static
const
string
&
getContentType
(
const
char
*
name
)
{
const
char
*
dot
;
...
...
@@ -284,9 +286,8 @@ static void canAccessPath(TcpSession &sender, const Parser &parser, const MediaI
bool
is_hls
=
end_of
(
path
,
kHlsSuffix
);
//该用户从来未获取过cookie,这个时候我们广播是否允许该用户访问该http目录
HttpSession
::
HttpAccessPathInvoker
accessPathInvoker
=
[
callback
,
uid
,
path
,
is_dir
,
is_hls
](
const
string
&
errMsg
,
const
string
&
cookie_path_in
,
int
cookieLifeSecond
)
{
HttpSession
::
HttpAccessPathInvoker
accessPathInvoker
=
[
callback
,
uid
,
path
,
is_dir
,
is_hls
,
mediaInfo
]
(
const
string
&
errMsg
,
const
string
&
cookie_path_in
,
int
cookieLifeSecond
)
{
HttpServerCookie
::
Ptr
cookie
;
if
(
cookieLifeSecond
)
{
//本次鉴权设置了有效期,我们把鉴权结果缓存在cookie中
...
...
@@ -305,8 +306,15 @@ static void canAccessPath(TcpSession &sender, const Parser &parser, const MediaI
(
*
cookie
)[
kAccessErrKey
].
set
<
string
>
(
errMsg
);
//记录访问的是否为hls
(
*
cookie
)[
kAccessHls
].
set
<
bool
>
(
is_hls
);
if
(
is_hls
){
//hls相关信息
replace
(
const_cast
<
string
&>
(
mediaInfo
.
_streamid
),
kHlsSuffix
,
""
);
(
*
cookie
)[
kHlsData
].
set
<
HlsCookieData
>
(
mediaInfo
);
}
callback
(
errMsg
,
cookie
);
}
else
{
callback
(
errMsg
,
nullptr
);
}
callback
(
errMsg
,
cookie
);
};
if
(
is_hls
&&
emitHlsPlayed
(
parser
,
mediaInfo
,
path
,
is_dir
,
accessPathInvoker
,
sender
))
{
...
...
@@ -369,6 +377,12 @@ static void accessFile(TcpSession &sender, const Parser &parser, const MediaInfo
httpHeader
[
"Set-Cookie"
]
=
cookie
->
getCookie
((
*
cookie
)[
kCookiePathKey
].
get
<
string
>
());
}
HttpSession
::
HttpResponseInvoker
invoker
=
[
&
](
const
string
&
codeOut
,
const
StrCaseMap
&
headerOut
,
const
HttpBody
::
Ptr
&
body
)
{
if
(
cookie
){
auto
is_hls
=
(
*
cookie
)[
kAccessHls
].
get
<
bool
>
();
if
(
is_hls
){
(
*
cookie
)[
kHlsData
].
get
<
HlsCookieData
>
().
addByteUsage
(
body
->
remainSize
());
}
}
cb
(
codeOut
.
data
(),
getContentType
(
strFile
.
data
()),
headerOut
,
body
);
};
invoker
.
responseFile
(
parser
.
getValues
(),
httpHeader
,
strFile
);
...
...
This diff is collapsed.
Click to expand it.
src/Player/PlayerProxy.cpp
查看文件 @
94806b2c
...
...
@@ -174,12 +174,8 @@ void PlayerProxy::rePlay(const string &strUrl,int iFailedCnt){
},
getPoller
());
}
int
PlayerProxy
::
readerCount
(){
return
(
_mediaMuxer
?
_mediaMuxer
->
readerCount
()
:
0
)
+
(
_pMediaSrc
?
_pMediaSrc
->
readerCount
()
:
0
);
}
bool
PlayerProxy
::
close
(
MediaSource
&
sender
,
bool
force
)
{
if
(
!
force
&&
readerCount
()
!=
0
){
if
(
!
force
&&
totalReaderCount
()
){
return
false
;
}
...
...
@@ -201,12 +197,20 @@ bool PlayerProxy::close(MediaSource &sender,bool force) {
}
void
PlayerProxy
::
onNoneReader
(
MediaSource
&
sender
)
{
if
(
!
_mediaMuxer
||
_mediaMuxer
->
readerCount
()
!=
0
){
if
(
!
_mediaMuxer
||
totalReaderCount
()
){
return
;
}
MediaSourceEvent
::
onNoneReader
(
sender
);
}
int
PlayerProxy
::
totalReaderCount
(){
return
(
_mediaMuxer
?
_mediaMuxer
->
totalReaderCount
()
:
0
)
+
(
_pMediaSrc
?
_pMediaSrc
->
readerCount
()
:
0
);
}
int
PlayerProxy
::
totalReaderCount
(
MediaSource
&
sender
)
{
return
totalReaderCount
();
}
class
MuteAudioMaker
:
public
FrameDispatcher
{
public
:
typedef
std
::
shared_ptr
<
MuteAudioMaker
>
Ptr
;
...
...
This diff is collapsed.
Click to expand it.
src/Player/PlayerProxy.h
查看文件 @
94806b2c
...
...
@@ -75,18 +75,15 @@ public:
* @param strUrl
*/
void
play
(
const
string
&
strUrl
)
override
;
/**
* 被主动关闭
* @return
*/
bool
close
(
MediaSource
&
sender
,
bool
force
)
override
;
private
:
//MediaSourceEvent override
bool
close
(
MediaSource
&
sender
,
bool
force
)
override
;
void
onNoneReader
(
MediaSource
&
sender
)
override
;
int
totalReaderCount
(
MediaSource
&
sender
)
override
;
int
totalReaderCount
()
;
void
rePlay
(
const
string
&
strUrl
,
int
iFailedCnt
);
void
onPlaySuccess
();
int
readerCount
()
;
private
:
bool
_bEnableRtsp
;
bool
_bEnableRtmp
;
...
...
This diff is collapsed.
Click to expand it.
src/Record/MP4Reader.cpp
查看文件 @
94806b2c
...
...
@@ -179,7 +179,7 @@ void MP4Reader::startReadMP4() {
return
true
;
}
bool
MP4Reader
::
close
(
MediaSource
&
sender
,
bool
force
){
if
(
!
_mediaMuxer
||
(
!
force
&&
_mediaMuxer
->
readerCount
()
!=
0
)){
if
(
!
_mediaMuxer
||
(
!
force
&&
_mediaMuxer
->
totalReaderCount
()
)){
return
false
;
}
_timer
.
reset
();
...
...
@@ -188,18 +188,22 @@ bool MP4Reader::close(MediaSource &sender,bool force){
}
void
MP4Reader
::
onNoneReader
(
MediaSource
&
sender
)
{
if
(
!
_mediaMuxer
||
_mediaMuxer
->
readerCount
()
!=
0
){
if
(
!
_mediaMuxer
||
_mediaMuxer
->
totalReaderCount
()
){
return
;
}
MediaSourceEvent
::
onNoneReader
(
sender
);
}
int
MP4Reader
::
totalReaderCount
(
MediaSource
&
sender
)
{
return
_mediaMuxer
?
_mediaMuxer
->
totalReaderCount
()
:
sender
.
readerCount
();
}
bool
MP4Reader
::
readSample
(
int
iTimeInc
,
bool
justSeekSyncFrame
)
{
TimeTicker
();
lock_guard
<
recursive_mutex
>
lck
(
_mtx
);
auto
bFlag0
=
readVideoSample
(
iTimeInc
,
justSeekSyncFrame
);
//数据没读完
auto
bFlag1
=
readAudioSample
(
iTimeInc
,
justSeekSyncFrame
);
//数据没读完
auto
bFlag2
=
_mediaMuxer
->
r
eaderCount
()
>
0
;
//读取者大于0
auto
bFlag2
=
_mediaMuxer
->
totalR
eaderCount
()
>
0
;
//读取者大于0
if
((
bFlag0
||
bFlag1
)
&&
bFlag2
){
_alive
.
resetTime
();
}
...
...
This diff is collapsed.
Click to expand it.
src/Record/MP4Reader.h
查看文件 @
94806b2c
...
...
@@ -57,19 +57,6 @@ public:
void
startReadMP4
();
/**
* 设置时移偏移量
* @param ui32Stamp 偏移量,单位毫秒
* @return
*/
bool
seekTo
(
MediaSource
&
sender
,
uint32_t
ui32Stamp
)
override
;
/**
* 关闭MP4Reader的流化进程,会触发该对象放弃自持有
* @return
*/
bool
close
(
MediaSource
&
sender
,
bool
force
)
override
;
/**
* 自动生成MP4Reader对象然后查找相关的MediaSource对象
* @param strSchema 协议名
* @param strVhost 虚拟主机
...
...
@@ -87,7 +74,11 @@ public:
bool
checkApp
=
true
);
private
:
//MediaSourceEvent override
bool
seekTo
(
MediaSource
&
sender
,
uint32_t
ui32Stamp
)
override
;
bool
close
(
MediaSource
&
sender
,
bool
force
)
override
;
void
onNoneReader
(
MediaSource
&
sender
)
override
;
int
totalReaderCount
(
MediaSource
&
sender
)
override
;
#ifdef ENABLE_MP4V2
void
seek
(
uint32_t
iSeekTime
,
bool
bReStart
=
true
);
inline
void
setSeekTime
(
uint32_t
iSeekTime
);
...
...
This diff is collapsed.
Click to expand it.
src/Rtmp/RtmpMediaSourceImp.h
查看文件 @
94806b2c
...
...
@@ -88,11 +88,11 @@ public:
}
}
/**
* 播放器总数
*/
int
readerCount
()
override
{
return
RtmpMediaSource
::
readerCount
()
+
(
_muxer
?
_muxer
->
r
eaderCount
()
:
0
);
/**
* 获取观看总人数,包括(hls/rtsp/rtmp)
*/
int
totalReaderCount
()
override
{
return
readerCount
()
+
(
_muxer
?
_muxer
->
totalR
eaderCount
()
:
0
);
}
/**
...
...
This diff is collapsed.
Click to expand it.
src/Rtmp/RtmpSession.cpp
查看文件 @
94806b2c
...
...
@@ -532,7 +532,7 @@ void RtmpSession::onSendMedia(const RtmpPacket::Ptr &pkt) {
bool
RtmpSession
::
close
(
MediaSource
&
sender
,
bool
force
)
{
//此回调在其他线程触发
if
(
!
_pPublisherSrc
||
(
!
force
&&
_pPublisherSrc
->
readerCount
()
!=
0
)){
if
(
!
_pPublisherSrc
||
(
!
force
&&
_pPublisherSrc
->
totalReaderCount
()
)){
return
false
;
}
string
err
=
StrPrinter
<<
"close media:"
<<
sender
.
getSchema
()
<<
"/"
<<
sender
.
getVhost
()
<<
"/"
<<
sender
.
getApp
()
<<
"/"
<<
sender
.
getId
()
<<
" "
<<
force
;
...
...
@@ -542,12 +542,16 @@ bool RtmpSession::close(MediaSource &sender,bool force) {
void
RtmpSession
::
onNoneReader
(
MediaSource
&
sender
)
{
//此回调在其他线程触发
if
(
!
_pPublisherSrc
||
_pPublisherSrc
->
readerCount
()
!=
0
){
if
(
!
_pPublisherSrc
||
_pPublisherSrc
->
totalReaderCount
()
){
return
;
}
MediaSourceEvent
::
onNoneReader
(
sender
);
}
int
RtmpSession
::
totalReaderCount
(
MediaSource
&
sender
)
{
return
_pPublisherSrc
?
_pPublisherSrc
->
totalReaderCount
()
:
sender
.
readerCount
();
}
void
RtmpSession
::
setSocketFlags
(){
GET_CONFIG
(
bool
,
ultraLowDelay
,
General
::
kUltraLowDelay
);
if
(
!
ultraLowDelay
)
{
...
...
This diff is collapsed.
Click to expand it.
src/Rtmp/RtmpSession.h
查看文件 @
94806b2c
...
...
@@ -83,8 +83,11 @@ private:
sendResponse
(
MSG_CMD
,
invoke
.
data
());
}
bool
close
(
MediaSource
&
sender
,
bool
force
)
override
;
//MediaSourceEvent override
bool
close
(
MediaSource
&
sender
,
bool
force
)
override
;
void
onNoneReader
(
MediaSource
&
sender
)
override
;
int
totalReaderCount
(
MediaSource
&
sender
)
override
;
void
setSocketFlags
();
string
getStreamId
(
const
string
&
str
);
void
dumpMetadata
(
const
AMFValue
&
metadata
);
...
...
This diff is collapsed.
Click to expand it.
src/Rtsp/RtspMediaSourceImp.h
查看文件 @
94806b2c
...
...
@@ -80,10 +80,10 @@ public:
}
/**
* 播放器总数
*/
int
readerCount
()
override
{
return
RtspMediaSource
::
readerCount
()
+
(
_muxer
?
_muxer
->
r
eaderCount
()
:
0
);
* 获取观看总人数,包括(hls/rtsp/rtmp)
*/
int
totalReaderCount
()
override
{
return
readerCount
()
+
(
_muxer
?
_muxer
->
totalR
eaderCount
()
:
0
);
}
/**
...
...
This diff is collapsed.
Click to expand it.
src/Rtsp/RtspSession.cpp
查看文件 @
94806b2c
...
...
@@ -1136,7 +1136,7 @@ inline int RtspSession::getTrackIndexByInterleaved(int interleaved){
bool
RtspSession
::
close
(
MediaSource
&
sender
,
bool
force
)
{
//此回调在其他线程触发
if
(
!
_pushSrc
||
(
!
force
&&
_pushSrc
->
readerCount
()
!=
0
)){
if
(
!
_pushSrc
||
(
!
force
&&
_pushSrc
->
totalReaderCount
()
)){
return
false
;
}
string
err
=
StrPrinter
<<
"close media:"
<<
sender
.
getSchema
()
<<
"/"
<<
sender
.
getVhost
()
<<
"/"
<<
sender
.
getApp
()
<<
"/"
<<
sender
.
getId
()
<<
" "
<<
force
;
...
...
@@ -1147,12 +1147,15 @@ bool RtspSession::close(MediaSource &sender,bool force) {
void
RtspSession
::
onNoneReader
(
MediaSource
&
sender
){
//此回调在其他线程触发
if
(
!
_pushSrc
||
_pushSrc
->
readerCount
()
!=
0
){
if
(
!
_pushSrc
||
_pushSrc
->
totalReaderCount
()
){
return
;
}
MediaSourceEvent
::
onNoneReader
(
sender
);
}
int
RtspSession
::
totalReaderCount
(
MediaSource
&
sender
)
{
return
_pushSrc
?
_pushSrc
->
totalReaderCount
()
:
sender
.
readerCount
();
}
void
RtspSession
::
sendRtpPacket
(
const
RtpPacket
::
Ptr
&
pkt
)
{
//InfoP(this) <<(int)pkt.Interleaved;
...
...
This diff is collapsed.
Click to expand it.
src/Rtsp/RtspSession.h
查看文件 @
94806b2c
...
...
@@ -108,8 +108,9 @@ protected:
//MediaSourceEvent override
bool
close
(
MediaSource
&
sender
,
bool
force
)
override
;
void
onNoneReader
(
MediaSource
&
sender
)
override
;
int
totalReaderCount
(
MediaSource
&
sender
)
override
;
//TcpSession override
//TcpSession override
int
send
(
const
Buffer
::
Ptr
&
pkt
)
override
;
/**
...
...
This diff is collapsed.
Click to expand it.
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论