

html
<div class="summary">
<h3>核心定义</h3>
<p><strong>文件:</strong> <code>src/brpc/socket.cpp:869</code></p>
<p><strong>功能:</strong> 标记socket为失败状态,触发健康检查,清理资源</p>
</div>
<div class="category">
<h2>协议实现中的使用</h2>
<table>
<thead>
<tr>
<th>协议类型</th>
<th>文件路径</th>
<th>代码示例</th>
<th>触发场景</th>
</tr>
</thead>
<tbody>
<tr>
<td>Thrift协议</td>
<td><code>src/brpc/policy/thrift_protocol.cpp:257</code></td>
<td class="code">sock->SetFailed();</td>
<td>解析Thrift请求失败时调用</td>
</tr>
<tr>
<td>Baidu RPC协议</td>
<td><code>src/brpc/policy/baidu_rpc_protocol.cpp:163</code></td>
<td class="code">sock->SetFailed();</td>
<td>解析Baidu RPC请求失败时调用</td>
</tr>
<tr>
<td>Hulu PBRPC协议</td>
<td><code>src/brpc/policy/hulu_pbrpc_protocol.cpp:237</code></td>
<td class="code">sock->SetFailed();</td>
<td>解析Hulu PBRPC请求失败时调用</td>
</tr>
<tr>
<td>SOFA PBRPC协议</td>
<td><code>src/brpc/policy/sofa_pbrpc_protocol.cpp:231</code></td>
<td class="code">sock->SetFailed();</td>
<td>解析SOFA PBRPC请求失败时调用</td>
</tr>
<tr>
<td>NSHead协议</td>
<td><code>src/brpc/policy/nshead_protocol.cpp:88</code></td>
<td class="code">sock->SetFailed();</td>
<td>解析NSHead请求失败时调用</td>
</tr>
<tr>
<td>JSF协议</td>
<td><code>src/brpc/policy/jsf_protocol.cpp:446</code></td>
<td class="code">sock->SetFailed();</td>
<td>解析JSF请求失败时调用</td>
</tr>
<tr>
<td>HTTP协议</td>
<td><code>src/brpc/policy/http_rpc_protocol.cpp:319</code></td>
<td class="code">socket->SetFailed();</td>
<td>HTTP请求处理失败时调用</td>
</tr>
<tr>
<td>Mongo协议</td>
<td><code>src/brpc/policy/mongo_protocol.cpp:64</code></td>
<td class="code">socket->SetFailed();</td>
<td>Mongo协议请求处理失败时调用</td>
</tr>
</tbody>
</table>
</div>
<div class="category">
<h2>连接管理中的使用</h2>
<table>
<thead>
<tr>
<th>组件类型</th>
<th>文件路径</th>
<th>代码示例</th>
<th>触发场景</th>
</tr>
</thead>
<tbody>
<tr>
<td>控制器发送失败</td>
<td><code>src/brpc/controller.cpp:788</code></td>
<td class="code">sending_sock->SetFailed();</td>
<td>控制器发送RPC请求失败时调用</td>
</tr>
<tr>
<td>选择通道失败</td>
<td><code>src/brpc/selective_channel.cpp:203</code></td>
<td class="code">ptr->SetFailed();</td>
<td>选择通道中的子通道失败时调用</td>
</tr>
<tr>
<td>接收器停止</td>
<td><code>src/brpc/acceptor.cpp:302</code></td>
<td class="code">accepted_sock->SetFailed();</td>
<td>服务器接收器停止时关闭连接</td>
</tr>
<tr>
<td>RTMP发送失败</td>
<td><code>src/brpc/rtmp.cpp:1756</code></td>
<td class="code">stream_rtmp->SetFailed();</td>
<td>RTMP流发送失败时调用</td>
</tr>
</tbody>
</table>
</div>
<div class="category">
<h2>测试文件中的使用</h2>
<table>
<thead>
<tr>
<th>测试类型</th>
<th>文件路径</th>
<th>代码示例</th>
<th>触发场景</th>
</tr>
</thead>
<tbody>
<tr>
<td>通道单元测试</td>
<td><code>test/brpc_channel_unittest.cpp:196</code></td>
<td class="code">ptr->SetFailed();</td>
<td>测试通道失败场景</td>
</tr>
<tr>
<td>HTTP协议单元测试</td>
<td><code>test/brpc_http_rpc_protocol_unittest.cpp:306</code></td>
<td class="code">_socket->SetFailed();</td>
<td>测试HTTP协议失败处理</td>
</tr>
<tr>
<td>Nova PBRPC单元测试</td>
<td><code>test/brpc_nova_pbrpc_protocol_unittest.cpp:153</code></td>
<td class="code">_socket->SetFailed();</td>
<td>测试Nova PBRPC协议失败处理</td>
</tr>
<tr>
<td>流RPC单元测试</td>
<td><code>test/brpc_streaming_rpc_unittest.cpp:306</code></td>
<td class="code">s->_host_socket->SetFailed();</td>
<td>测试流RPC主机socket失败场景</td>
</tr>
</tbody>
</table>
</div>
<div class="summary">
<h3>总结</h3>
<p><code>Socket::SetFailed()</code> 主要在以下场景被调用:</p>
<ol>
<li><strong>协议解析失败</strong>: 各种RPC协议解析请求数据失败时</li>
<li><strong>连接管理</strong>: 服务器停止、连接关闭、发送失败等情况</li>
<li><strong>错误处理</strong>: 控制器处理RPC请求过程中遇到错误</li>
<li><strong>测试验证</strong>: 单元测试中模拟socket失败场景</li>
</ol>
<p>该函数是BRPC框架中socket生命周期管理的核心组件,确保在出现错误时能够正确清理资源并触发健康检查机制。</p>
</div>
</div>
From ai