//关闭quicsocket
QuicCloseSocket(conn);
//跟踪这个函数
int QuicCloseSocket(QuicSocket sock)
{
EntryPtr entry = EntryBase::GetFdManager().Get(sock);
if (!entry || entry->Category() != EntryCategory::Socket) {
DebugPrint(dbg_api, "sock = %d, return = -1, errno = EBADF", sock);
errno = EBADF;
return -1;
}
auto socket = std::dynamic_pointer_cast<QuicSocketEntry>(entry);
socket->Close();
QuicSocketEntry::DeleteQuicSocketEntry(socket);
DebugPrint(dbg_api, "sock = %d, return = 0", sock);
return 0;
}
//CLose()函数
socket->Close();
int QuicSocketEntry::Close()
{
if (socketState_ == QuicSocketState_Closed)
return 0;
std::unique_lock<std::recursive_mutex> lock(mtx_);
if (socketState_ == QuicSocketState_Closed)
return 0;
socketState_ = QuicSocketState_Closed;
connectionVisitor_.CancelNoAckAlarm();
if (udpSocket_)
GetConnectionManager().Delete(*udpSocket_, impl_->connection_id(), Fd());
impl_->CloseConnection("");
ClearWaitingsByClose();
ClearAcceptSocketByClose();
return 0;
}
//流关闭
QuicCloseStream(fd);
跟踪这个函数
int QuicCloseStream(QuicStream stream)
{
auto entry = EntryBase::GetFdManager().Get(stream);
if (!entry || entry->Category() != EntryCategory::Stream) {
DebugPrint(dbg_api, "stream = %d, return = -1, errno = EBADF", stream);
errno = EBADF;
return -1;
}
entry->Close();
auto streamPtr = std::dynamic_pointer_cast<QuicStreamEntry>(entry);
QuicStreamEntry::DeleteQuicStream(streamPtr);
DebugPrint(dbg_api, "stream = %d, return = 0", stream);
return 0;
}
//关闭函数
entry->Close();
本文详细解析了QUIC协议中Socket与Stream的关闭流程,包括QuicCloseSocket与QuicCloseStream函数的具体实现,展示了如何通过EntryBase获取连接入口并执行关闭操作,同时介绍了与关闭操作相关的状态检查与资源清理过程。
745

被折叠的 条评论
为什么被折叠?



