首页
下载
文档
社区
视频
捐赠
源代码
赞助商
AOT 编译器
AI 助理
商业产品
PHP AOT 原生编译器
Swoole-Compiler 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
WARNING swWorker_discard_data (ERRNO 1007): [2] received the wrong data[89 bytes] from socket#5
WARNING swWorker_discard_data (ERRNO 1007): [2] received the wrong data[89 bytes] from socket#5 你好,这种是什么错误?如果想查清楚收到的是什么数据,怎么打印出来? 这种错误该如何去处理呢? 附上连包处理方式: 'open_length_check' => true, 'package_max_length' => 819200, 'package_length_type' => 'N', 'package_length_offset' => 0, 'package_body_offset' => 4, 加密解密方式: /** * 封装tcp包 * @param unknown $string */ public function encode($buffer){ //json序列化,并加上换行符作为请求结束的标记 $string = json_encode($buffer); $len = pack("N", strlen($string)); $package = $len . $string; return $package; } /** * 解包防止粘包 * @param unknown $string */ public function decode($package){ $length = unpack("N" , $package)[1]; $msg = substr($package,-$length); return json_decode($msg,true); }
发布于6年前 · 22 次浏览 · 来自
提问
C
Caption
WARNING swWorker_discard_data (ERRNO 1007): [2] received the wrong data[89 bytes] from socket#5 你好,这种是什么错误?如果想查清楚收到的是什么数据,怎么打印出来? 这种错误该如何去处理呢? 附上连包处理方式: 'open_length_check' => true, 'package_max_length' => 819200, 'package_length_type' => 'N', 'package_length_offset' => 0, 'package_body_offset' => 4, 加密解密方式: /** * 封装tcp包 * @param unknown $string */ public function encode($buffer){ //json序列化,并加上换行符作为请求结束的标记 $string = json_encode($buffer); $len = pack("N", strlen($string)); $package = $len . $string; return $package; } /** * 解包防止粘包 * @param unknown $string */ public function decode($package){ $length = unpack("N" , $package)[1]; $msg = substr($package,-$length); return json_decode($msg,true); }
赞
0
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
登录
后参与评论
评论
2020-07-22
鲁飞
接收到了超时的数据,TCP 关闭连接后,可能会有部分数据残留在 unixSocket 缓存区内,这部分数据会被丢弃
赞
0
回复
2020-07-24
C
Caption
回复
鲁飞
那这部分数据不用管是吗? 我走的cs架构,有时候任务间隔不对,有没有可能是我粘包导致的?
赞
0
回复
2020-07-23
m
marionjson
可以看下 reactor_thread.cc的源码: ``` static int swReactorThread_onPipeWrite(swReactor *reactor, swEvent *ev) { int ret; swBuffer_chunk *chunk = NULL; swEventData *send_data; swConnection *conn; swServer *serv = (swServer *) reactor->ptr; swBuffer *buffer = ev->socket->out_buffer; while (!swBuffer_empty(buffer)) { chunk = swBuffer_get_chunk(buffer); send_data = (swEventData *) chunk->store.ptr; //server active close, discard data. if (swEventData_is_stream(send_data->info.type)) { //send_data->info.fd is session_id conn = swServer_connection_verify(serv, send_data->info.fd); if (conn) { if (conn->closed) { swoole_error_log(SW_LOG_NOTICE, SW_ERROR_SESSION_CLOSED_BY_SERVER, "Session#%d is closed by server", send_data->info.fd); _discard: swBuffer_pop_chunk(buffer, chunk); continue; } } else if (serv->discard_timeout_request) { swoole_error_log( SW_LOG_WARNING, SW_ERROR_SESSION_DISCARD_TIMEOUT_DATA, "[1] received the wrong data[%d bytes] from socket#%d", send_data->info.len, send_data->info.fd ); goto _discard; } } ret = swSocket_send(ev->socket, chunk->store.ptr, chunk->length, 0); if (ret < 0) { return (swConnection_error(errno) == SW_WAIT) ? SW_OK : SW_ERR; } else { swBuffer_pop_chunk(buffer, chunk); } } if (swBuffer_empty(buffer)) { if (swReactor_remove_write_event(reactor, ev->socket) < 0) { swSysWarn("reactor->set(%d) failed", ev->fd); } } return SW_OK; } ``` 从源码可以看出 当sw服务器轮询检查连接,如果不能获取到连接信息,且线程标记为discard_timeout_request(放弃超时请求)时,就会提示超时错误请求,
赞
0
回复