Skip to content

Commit

Permalink
修复socket reset强制关闭时获取socket地址信息失败的问题 (ZLMediaKit#170)
Browse files Browse the repository at this point in the history
在对方异常关闭socket时,内核将收到tcp socket reset强制关闭信息(而非eof),
此时将导致socket关联的地址信息被清空,从而在onError回调时获取地址信息失败。
通过提前缓存地址信息可以解决该问题。
Fix ZLMediaKit/ZLMediaKit#2749
  • Loading branch information
xiongguangjie committed Aug 14, 2023
1 parent d201652 commit d3a89c6
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 4 deletions.
16 changes: 12 additions & 4 deletions src/Network/Socket.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -613,38 +613,46 @@ int Socket::onAccept(int sock, int event) noexcept {
void Socket::setPeerSock(int fd, SockNum::SockType type) {
LOCK_GUARD(_mtx_sock_fd);
_sock_fd = makeSock(fd, type);
SockUtil::get_sock_local_addr(fd,_local_addr);
SockUtil::get_sock_peer_addr(fd,_peer_addr);
}

string Socket::get_local_ip() {
LOCK_GUARD(_mtx_sock_fd);
if (!_sock_fd) {
return "";
}
return SockUtil::get_local_ip(_sock_fd->rawFd());
return SockUtil::inet_ntoa((struct sockaddr *)&_local_addr);
}

uint16_t Socket::get_local_port() {
LOCK_GUARD(_mtx_sock_fd);
if (!_sock_fd) {
return 0;
}
return SockUtil::get_local_port(_sock_fd->rawFd());
return SockUtil::inet_port((struct sockaddr *)&_local_addr);
}

string Socket::get_peer_ip() {
LOCK_GUARD(_mtx_sock_fd);
if (!_sock_fd) {
return "";
}
return SockUtil::get_peer_ip(_sock_fd->rawFd());
if(_udp_send_dst){
return SockUtil::inet_ntoa((struct sockaddr *)_udp_send_dst.get());
}
return SockUtil::inet_ntoa((struct sockaddr *)&_peer_addr);
}

uint16_t Socket::get_peer_port() {
LOCK_GUARD(_mtx_sock_fd);
if (!_sock_fd) {
return 0;
}
return SockUtil::get_peer_port(_sock_fd->rawFd());
if(_udp_send_dst){
return SockUtil::inet_port((struct sockaddr *)_udp_send_dst.get());
}
return SockUtil::inet_port((struct sockaddr *)&_peer_addr);
}

string Socket::getIdentifier() const {
Expand Down
5 changes: 5 additions & 0 deletions src/Network/Socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -576,6 +576,11 @@ class Socket : public std::enable_shared_from_this<Socket>, public noncopyable,
BufferList::SendResult _send_result;
//对象个数统计
ObjectStatistic<Socket> _statistic;

//链接缓存地址,防止tcp reset 导致无法获取对端的地址
struct sockaddr_storage _local_addr;
struct sockaddr_storage _peer_addr;

};

class SockSender {
Expand Down

0 comments on commit d3a89c6

Please sign in to comment.