Toggle navigation
Toggle navigation
此项目
正在载入...
Sign in
胡斌
/
srs
转到一个项目
Toggle navigation
项目
群组
代码片段
帮助
Toggle navigation pinning
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Authored by
winlin
2013-10-23 20:59:08 +0800
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
2a346c2398c827d26cd9a67aac0ac536b2239114
2a346c23
1 parent
5d1d0ff8
support send acknowledgement when recv message.
隐藏空白字符变更
内嵌
并排对比
正在显示
5 个修改的文件
包含
135 行增加
和
9 行删除
trunk/src/core/srs_core_log.hpp
trunk/src/core/srs_core_protocol.cpp
trunk/src/core/srs_core_protocol.hpp
trunk/src/core/srs_core_socket.cpp
trunk/src/core/srs_core_socket.hpp
trunk/src/core/srs_core_log.hpp
查看文件 @
2a346c2
...
...
@@ -78,7 +78,7 @@ extern ILogContext* log_context;
#undef srs_verbose
#define srs_verbose(msg, ...) (void)0
#endif
#if
0
#if
1
#undef srs_info
#define srs_info(msg, ...) (void)0
#endif
...
...
trunk/src/core/srs_core_protocol.cpp
查看文件 @
2a346c2
...
...
@@ -249,6 +249,10 @@ messages.
/****************************************************************************
*****************************************************************************
****************************************************************************/
SrsProtocol
::
AckWindowSize
::
AckWindowSize
()
{
ack_window_size
=
acked_size
=
0
;
}
SrsProtocol
::
SrsProtocol
(
st_netfd_t
client_stfd
)
{
...
...
@@ -450,6 +454,21 @@ int SrsProtocol::on_recv_message(SrsCommonMessage* msg)
int
ret
=
ERROR_SUCCESS
;
srs_assert
(
msg
!=
NULL
);
// acknowledgement
if
(
skt
->
get_recv_bytes
()
-
in_ack_size
.
acked_size
>
in_ack_size
.
ack_window_size
)
{
SrsCommonMessage
*
ack
=
new
SrsCommonMessage
();
SrsAcknowledgementPacket
*
pkt
=
new
SrsAcknowledgementPacket
();
in_ack_size
.
acked_size
=
pkt
->
sequence_number
=
skt
->
get_recv_bytes
();
ack
->
set_packet
(
pkt
,
0
);
if
((
ret
=
send_message
(
ack
))
!=
ERROR_SUCCESS
)
{
srs_error
(
"send acknowledgement failed. ret=%d"
,
ret
);
return
ret
;
}
srs_verbose
(
"send acknowledgement success."
);
}
switch
(
msg
->
header
.
message_type
)
{
case
RTMP_MSG_SetChunkSize
:
...
...
@@ -466,8 +485,13 @@ int SrsProtocol::on_recv_message(SrsCommonMessage* msg)
case
RTMP_MSG_WindowAcknowledgementSize
:
{
SrsSetWindowAckSizePacket
*
pkt
=
dynamic_cast
<
SrsSetWindowAckSizePacket
*>
(
msg
->
get_packet
());
srs_assert
(
pkt
!=
NULL
);
// TODO: take effect.
srs_trace
(
"set ack window size to %d"
,
pkt
->
ackowledgement_window_size
);
if
(
pkt
->
ackowledgement_window_size
>
0
)
{
in_ack_size
.
ack_window_size
=
pkt
->
ackowledgement_window_size
;
srs_trace
(
"set ack window size to %d"
,
pkt
->
ackowledgement_window_size
);
}
else
{
srs_warn
(
"ignored. set ack window size is %d"
,
pkt
->
ackowledgement_window_size
);
}
break
;
}
case
RTMP_MSG_SetChunkSize
:
{
...
...
@@ -2222,6 +2246,48 @@ int SrsSetWindowAckSizePacket::encode_packet(SrsStream* stream)
return
ret
;
}
SrsAcknowledgementPacket
::
SrsAcknowledgementPacket
()
{
sequence_number
=
0
;
}
SrsAcknowledgementPacket
::~
SrsAcknowledgementPacket
()
{
}
int
SrsAcknowledgementPacket
::
get_perfer_cid
()
{
return
RTMP_CID_ProtocolControl
;
}
int
SrsAcknowledgementPacket
::
get_message_type
()
{
return
RTMP_MSG_Acknowledgement
;
}
int
SrsAcknowledgementPacket
::
get_size
()
{
return
4
;
}
int
SrsAcknowledgementPacket
::
encode_packet
(
SrsStream
*
stream
)
{
int
ret
=
ERROR_SUCCESS
;
if
(
!
stream
->
require
(
4
))
{
ret
=
ERROR_RTMP_MESSAGE_ENCODE
;
srs_error
(
"encode acknowledgement packet failed. ret=%d"
,
ret
);
return
ret
;
}
stream
->
write_4bytes
(
sequence_number
);
srs_verbose
(
"encode acknowledgement packet "
"success. sequence_number=%d"
,
sequence_number
);
return
ret
;
}
SrsSetChunkSizePacket
::
SrsSetChunkSizePacket
()
{
chunk_size
=
RTMP_DEFAULT_CHUNK_SIZE
;
...
...
trunk/src/core/srs_core_protocol.hpp
查看文件 @
2a346c2
...
...
@@ -75,6 +75,14 @@ class ISrsMessage;
*/
class
SrsProtocol
{
private
:
struct
AckWindowSize
{
int
ack_window_size
;
int64_t
acked_size
;
AckWindowSize
();
};
// peer in/out
private:
st_netfd_t
stfd
;
...
...
@@ -85,6 +93,7 @@ private:
std
::
map
<
int
,
SrsChunkStream
*>
chunk_streams
;
SrsBuffer
*
buffer
;
int32_t
in_chunk_size
;
AckWindowSize
in_ack_size
;
// peer out
private:
char
out_header_fmt0
[
RTMP_MAX_FMT0_HEADER_SIZE
];
...
...
@@ -850,6 +859,34 @@ protected:
};
/**
* 5.3. Acknowledgement (3)
* The client or the server sends the acknowledgment to the peer after
* receiving bytes equal to the window size.
*/
class
SrsAcknowledgementPacket
:
public
SrsPacket
{
private
:
typedef
SrsPacket
super
;
protected
:
virtual
const
char
*
get_class_name
()
{
return
CLASS_NAME_STRING
(
SrsAcknowledgementPacket
);
}
public
:
int32_t
sequence_number
;
public
:
SrsAcknowledgementPacket
();
virtual
~
SrsAcknowledgementPacket
();
public
:
virtual
int
get_perfer_cid
();
public
:
virtual
int
get_message_type
();
protected
:
virtual
int
get_size
();
virtual
int
encode_packet
(
SrsStream
*
stream
);
};
/**
* 7.1. Set Chunk Size
* Protocol control message 1, Set Chunk Size, is used to notify the
* peer about the new maximum chunk size.
...
...
trunk/src/core/srs_core_socket.cpp
查看文件 @
2a346c2
...
...
@@ -28,8 +28,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
SrsSocket
::
SrsSocket
(
st_netfd_t
client_stfd
)
{
stfd
=
client_stfd
;
recv_timeout
=
ST_UTIME_NO_TIMEOUT
;
send_timeout
=
ST_UTIME_NO_TIMEOUT
;
send_timeout
=
recv_timeout
=
ST_UTIME_NO_TIMEOUT
;
recv_bytes
=
send_bytes
=
0
;
}
SrsSocket
::~
SrsSocket
()
...
...
@@ -46,6 +46,16 @@ void SrsSocket::set_send_timeout(int timeout_ms)
send_timeout
=
timeout_ms
*
1000
;
}
int64_t
SrsSocket
::
get_recv_bytes
()
{
return
recv_bytes
;
}
int64_t
SrsSocket
::
get_send_bytes
()
{
return
send_bytes
;
}
int
SrsSocket
::
read
(
const
void
*
buf
,
size_t
size
,
ssize_t
*
nread
)
{
int
ret
=
ERROR_SUCCESS
;
...
...
@@ -63,8 +73,10 @@ int SrsSocket::read(const void* buf, size_t size, ssize_t* nread)
errno
=
ECONNRESET
;
}
ret
=
ERROR_SOCKET_READ
;
ret
urn
ERROR_SOCKET_READ
;
}
recv_bytes
+=
*
nread
;
return
ret
;
}
...
...
@@ -86,9 +98,11 @@ int SrsSocket::read_fully(const void* buf, size_t size, ssize_t* nread)
errno
=
ECONNRESET
;
}
ret
=
ERROR_SOCKET_READ_FULLY
;
ret
urn
ERROR_SOCKET_READ_FULLY
;
}
recv_bytes
+=
*
nread
;
return
ret
;
}
...
...
@@ -103,8 +117,10 @@ int SrsSocket::write(const void* buf, size_t size, ssize_t* nwrite)
return
ERROR_SOCKET_TIMEOUT
;
}
ret
=
ERROR_SOCKET_WRITE
;
ret
urn
ERROR_SOCKET_WRITE
;
}
send_bytes
+=
*
nwrite
;
return
ret
;
}
...
...
@@ -120,9 +136,11 @@ int SrsSocket::writev(const iovec *iov, int iov_size, ssize_t* nwrite)
return
ERROR_SOCKET_TIMEOUT
;
}
ret
=
ERROR_SOCKET_WRITE
;
ret
urn
ERROR_SOCKET_WRITE
;
}
send_bytes
+=
*
nwrite
;
return
ret
;
}
...
...
trunk/src/core/srs_core_socket.hpp
查看文件 @
2a346c2
...
...
@@ -41,6 +41,8 @@ class SrsSocket
private
:
int64_t
recv_timeout
;
int64_t
send_timeout
;
int64_t
recv_bytes
;
int64_t
send_bytes
;
st_netfd_t
stfd
;
public
:
SrsSocket
(
st_netfd_t
client_stfd
);
...
...
@@ -48,6 +50,9 @@ public:
public
:
virtual
void
set_recv_timeout
(
int
timeout_ms
);
virtual
void
set_send_timeout
(
int
timeout_ms
);
virtual
int64_t
get_recv_bytes
();
virtual
int64_t
get_send_bytes
();
public
:
virtual
int
read
(
const
void
*
buf
,
size_t
size
,
ssize_t
*
nread
);
virtual
int
read_fully
(
const
void
*
buf
,
size_t
size
,
ssize_t
*
nread
);
virtual
int
write
(
const
void
*
buf
,
size_t
size
,
ssize_t
*
nwrite
);
...
...
请
注册
或
登录
后发表评论