成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁(yè) > 知識(shí)庫(kù) > Swoole源碼中如何查詢Websocket的連接問(wèn)題詳解

Swoole源碼中如何查詢Websocket的連接問(wèn)題詳解

熱門標(biāo)簽:ai電話機(jī)器人加盟代理 OMG地圖標(biāo)注app 地圖標(biāo)注視頻廣告入駐 gps 地圖標(biāo)注軟件 400電話鄭州申請(qǐng) 招標(biāo)自動(dòng)語(yǔ)音外呼系統(tǒng) 中原區(qū)電話機(jī)器人價(jià)格 黔江400電話如何辦理 電銷機(jī)器人便宜的有嗎

問(wèn)題

我們項(xiàng)目的 Websocket Server 使用的 Swoole,最近在搭建 beta 環(huán)境的時(shí)候發(fā)現(xiàn) Websocket 協(xié)議雖然升級(jí)成功了,但是會(huì)出現(xiàn)定時(shí)重連,心跳、數(shù)據(jù)也一直沒(méi)有發(fā)送。項(xiàng)目的生產(chǎn)環(huán)境和 beta 一致,但是生產(chǎn)環(huán)境確沒(méi)有這個(gè)問(wèn)題。

定位問(wèn)題

為了方便調(diào)試 Swoole,以下測(cè)試是在本地環(huán)境下進(jìn)行。

查看 PHP 日志

在 PHP 日志里,發(fā)現(xiàn)一條錯(cuò)誤日志: ErrorException: Swoole\WebSocket\Server::push(): the connected client of connection[47] is not a websocket client or closed,說(shuō)明 Websocket 連接已經(jīng) close 了。

抓包

既然連接被 close 掉了,那我們來(lái)看看是誰(shuí)主動(dòng)關(guān)閉的連接。Swoole 監(jiān)聽的端口是 1215,通過(guò) tcpdump -nni lo0 -X port 1215 可以看到,Swoole 在發(fā)出協(xié)議升級(jí)的響應(yīng)報(bào)文后,又發(fā)出了 Fin 報(bào)文段,即 Swoole 主動(dòng)斷開了連接,所以才會(huì)出現(xiàn)瀏覽器顯示 WebSocket 連接建立成功,但是又定時(shí)重連的問(wèn)題。

10:22:58.060810 IP 127.0.0.1.1215 > 127.0.0.1.53823: Flags [P.], seq 1:185, ack 1372, win 6358, options [nop,nop,TS val 1981911666 ecr 1981911665], length 184
    0x0000:  4500 00ec 0000 4000 4006 0000 7f00 0001  E.....@.@.......
    0x0010:  7f00 0001 04bf d23f 9377 304a 6d2f 9604  .......?.w0Jm/..
    0x0020:  8018 18d6 fee0 0000 0101 080a 7621 9272  ............v!.r
    0x0030:  7621 9271 4854 5450 2f31 2e31 2031 3031  v!.qHTTP/1.1.101
    0x0040:  2053 7769 7463 6869 6e67 2050 726f 746f  .Switching.Proto
    0x0050:  636f 6c73 0d0a 5570 6772 6164 653a 2077  cols..Upgrade:.w
    0x0060:  6562 736f 636b 6574 0d0a 436f 6e6e 6563  ebsocket..Connec
    0x0070:  7469 6f6e 3a20 5570 6772 6164 650d 0a53  tion:.Upgrade..S
    0x0080:  6563 2d57 6562 536f 636b 6574 2d41 6363  ec-WebSocket-Acc
    0x0090:  6570 743a 2052 6370 3851 6663 446c 3146  ept:.Rcp8QfcDl1F
    0x00a0:  776e 666a 6377 3862 4933 6971 7176 4551  wnfjcw8bI3iqqvEQ
    0x00b0:  3d0d 0a53 6563 2d57 6562 536f 636b 6574  =..Sec-WebSocket
    0x00c0:  2d56 6572 7369 6f6e 3a20 3133 0d0a 5365  -Version:.13..Se
    0x00d0:  7276 6572 3a20 7377 6f6f 6c65 2d68 7474  rver:.swoole-htt
    0x00e0:  702d 7365 7276 6572 0d0a 0d0a            p-server....
10:22:58.060906 IP 127.0.0.1.53823 > 127.0.0.1.1215: Flags [.], ack 185, win 6376, options [nop,nop,TS val 1981911666 ecr 1981911666], length 0
    0x0000:  4500 0034 0000 4000 4006 0000 7f00 0001  E..4..@.@.......
    0x0010:  7f00 0001 d23f 04bf 6d2f 9604 9377 3102  .....?..m/...w1.
    0x0020:  8010 18e8 fe28 0000 0101 080a 7621 9272  .....(......v!.r
    0x0030:  7621 9272                                v!.r
10:22:58.061467 IP 127.0.0.1.1215 > 127.0.0.1.53823: Flags [F.], seq 185, ack 1372, win 6358, options [nop,nop,TS val 1981911667 ecr 1981911666], length 0
    0x0000:  4500 0034 0000 4000 4006 0000 7f00 0001  E..4..@.@.......
    0x0010:  7f00 0001 04bf d23f 9377 3102 6d2f 9604  .......?.w1.m/..
    0x0020:  8011 18d6 fe28 0000 0101 080a 7621 9273  .....(......v!.s
    0x0030:  7621 9272                                v!.r

追蹤 Swoole 源碼

我們現(xiàn)在知道了是 Swoole 主動(dòng)斷開了連接,但它是在什么時(shí)候斷開的,又為什么要斷開呢?就讓我們從源碼一探究竟。

從抓包結(jié)果看,發(fā)出響應(yīng)報(bào)文到 close 連接的時(shí)間很短,所以猜測(cè)是握手階段出了問(wèn)題。從響應(yīng)報(bào)文可以看出,Websocket 連接是建立成功的,推測(cè) swoole_websocket_handshake() 的結(jié)果應(yīng)該是 true,那么連接應(yīng)該是在 swoole_websocket_handshake() 里 close 的。

// // swoole_websocket_server.cc
int swoole_websocket_onHandshake(swServer *serv, swListenPort *port, http_context *ctx)
{
  int fd = ctx->fd;
  bool success = swoole_websocket_handshake(ctx);
  if (success)
  {
    swoole_websocket_onOpen(serv, ctx);
  }
  else
  {
    serv->close(serv, fd, 1);
  }
  if (!ctx->end)
  {
    swoole_http_context_free(ctx);
  }
  return SW_OK;
}

追蹤進(jìn) swoole_websocket_handshake() 里,前面部分都是設(shè)置響應(yīng)的 header,響應(yīng)報(bào)文則是在 swoole_http_response_end() 里發(fā)出的,它的結(jié)果也就是 swoole_websocket_handshake 的結(jié)果。

// swoole_websocket_server.cc
bool swoole_websocket_handshake(http_context *ctx)
{
  ...

  swoole_http_response_set_header(ctx, ZEND_STRL("Upgrade"), ZEND_STRL("websocket"), false);
  swoole_http_response_set_header(ctx, ZEND_STRL("Connection"), ZEND_STRL("Upgrade"), false);
  swoole_http_response_set_header(ctx, ZEND_STRL("Sec-WebSocket-Accept"), sec_buf, sec_len, false);
  swoole_http_response_set_header(ctx, ZEND_STRL("Sec-WebSocket-Version"), ZEND_STRL(SW_WEBSOCKET_VERSION), false);

    ...

  ctx->response.status = 101;
  ctx->upgrade = 1;

  zval retval;
  swoole_http_response_end(ctx, nullptr, retval);
  return Z_TYPE(retval) == IS_TRUE;
}

從 swoole_http_response_end() 代碼中我們發(fā)現(xiàn),如果 ctx->keepalive 為 0 的話則關(guān)閉連接,斷點(diǎn)調(diào)試下發(fā)現(xiàn)還真就是 0。至此,連接斷開的地方我們就找到了,下面我們就看下什么情況下 ctx->keepalive 設(shè)置為 1。

// swoole_http_response.cc
void swoole_http_response_end(http_context *ctx, zval *zdata, zval *return_value)
{
  if (ctx->chunk) {
    ...
  } else {
    ...

      if (!ctx->send(ctx, swoole_http_buffer->str, swoole_http_buffer->length))
    {
      ctx->send_header = 0;
      RETURN_FALSE;
    } 
  }

  if (ctx->upgrade  !ctx->co_socket) {
    swServer *serv = (swServer*) ctx->private_data;
    swConnection *conn = swWorker_get_connection(serv, ctx->fd);

    // 此時(shí)websocket_statue 已經(jīng)是WEBSOCKET_STATUS_ACTIVE,不會(huì)走進(jìn)這步邏輯
    if (conn  conn->websocket_status == WEBSOCKET_STATUS_HANDSHAKE) {
      if (ctx->response.status == 101) {
        conn->websocket_status = WEBSOCKET_STATUS_ACTIVE;
      } else {
        /* connection should be closed when handshake failed */
        conn->websocket_status = WEBSOCKET_STATUS_NONE;
        ctx->keepalive = 0;
      }
    }
  }

  if (!ctx->keepalive) {
    ctx->close(ctx);
  }
  ctx->end = 1;
  RETURN_TRUE;
}

最終我們找到 ctx->keepalive 是在 swoole_http_should_keep_alive() 里設(shè)置的。從代碼我們知道,當(dāng) HTTP 協(xié)議是 1.1 版本時(shí),keepalive 取決于 header 沒(méi)有設(shè)置 Connection: close;當(dāng)為 1.0 版本時(shí),header 需設(shè)置 Connection: keep-alive。

Websocket 協(xié)議規(guī)定,請(qǐng)求 header 里的 Connection 需設(shè)置為 Upgrade,所以我們需要改用 HTTP/1.1 協(xié)議。

int swoole_http_should_keep_alive (swoole_http_parser *parser)
{
 if (parser->http_major > 0  parser->http_minor > 0) {
  /* HTTP/1.1 */
  if (parser->flags  F_CONNECTION_CLOSE) {
   return 0;
  } else {
   return 1;
  }
 } else {
  /* HTTP/1.0 or earlier */
  if (parser->flags  F_CONNECTION_KEEP_ALIVE) {
   return 1;
  } else {
   return 0;
  }
 }
}

解決問(wèn)題

從上面的結(jié)論我們可以知道,問(wèn)題的關(guān)鍵點(diǎn)在于請(qǐng)求頭的 Connection 和 HTTP 協(xié)議版本。

后來(lái)問(wèn)了下運(yùn)維,生產(chǎn)環(huán)境的 LB 會(huì)在轉(zhuǎn)發(fā)請(qǐng)求時(shí),會(huì)將 HTTP 協(xié)議版本修改為 1.1,這也是為什么只有 beta 環(huán)境存在這個(gè)問(wèn)題,nginx 的 access_log 也印證了這一點(diǎn)。

那么解決這個(gè)問(wèn)題就很簡(jiǎn)單了,就是手動(dòng)升級(jí)下 HTTP 協(xié)議的版本,完整的 nginx 配置如下。

upstream service {
  server 127.0.0.1:1215;
}

server {
  listen 80;
  server_name dev-service.ts.com;

  location / {
    proxy_set_header Host $http_host;
    proxy_set_header Scheme $scheme;
    proxy_set_header SERVER_PORT $server_port;
    proxy_set_header REMOTE_ADDR $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    proxy_http_version 1.1;

    proxy_pass http://service;
  }
}

重啟 Nginx 后,Websocket 終于正常了~

總結(jié)

到此這篇關(guān)于Swoole源碼中如何查詢Websocket的連接問(wèn)題的文章就介紹到這了,更多相關(guān)Swoole源碼查詢Websocket連接問(wèn)題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 詳解PHP Swoole與TCP三次握手
  • Swoole擴(kuò)展的6種模式深入詳解
  • php中Swoole的熱更新實(shí)現(xiàn)代碼實(shí)例
  • swoole鎖的機(jī)制代碼實(shí)例講解
  • windows系統(tǒng)php環(huán)境安裝swoole具體步驟
  • linux系統(tǒng)虛擬主機(jī)開啟支持Swoole Loader擴(kuò)展的方法
  • 在Windows系統(tǒng)上安裝Cygwin搭建Swoole測(cè)試環(huán)境的圖文教程
  • php使用goto實(shí)現(xiàn)自動(dòng)重啟swoole、reactphp、workerman服務(wù)的代碼
  • Centos7安裝swoole擴(kuò)展操作示例
  • 詳解Swoole TCP流數(shù)據(jù)邊界問(wèn)題解決方案

標(biāo)簽:孝感 哈密 濟(jì)源 那曲 阿里 日照 北京 池州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Swoole源碼中如何查詢Websocket的連接問(wèn)題詳解》,本文關(guān)鍵詞  Swoole,源碼,中,如何,查詢,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Swoole源碼中如何查詢Websocket的連接問(wèn)題詳解》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Swoole源碼中如何查詢Websocket的連接問(wèn)題詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    jizz在线观看| 国产精品日韩一区二区| 日韩av一二三四区| 无码人妻精品一区二区| 日韩影片中文字幕| 男男成人高潮片免费网站| 国产卡一卡二在线| 在线观看入口黄最新永久免费国产| 在线激情影院一区| av一区二区在线看| 成人精品国产亚洲| 黄色小网站91| 菠萝蜜视频网址| 欧美高清视频一区二区三区在线观看| 亚洲毛片在线观看| 妞干网在线免费视频| 在线观看视频免费一区二区三区| 午夜欧美一区二区三区在线播放| 日韩中文字幕亚洲一区二区va在线| 国产伦精品一区二区| 国产精品一区免费观看| 91资源在线观看| 91香蕉视频在线观看视频| 日韩三级电影网址| 精品国产乱码久久久久久蜜臀| 日本一极黄色片| 日韩va亚洲va欧洲va国产| 欧美成人精品h版在线观看| 91午夜精品亚洲一区二区三区| 日本精品600av| 一区二区视频在线播放| 91福利精品视频| 久久精品免费av| 亚洲va国产天堂va久久en| 99在线观看视频网站| 在线观看日韩av先锋影音电影院| 樱花www成人免费视频| 亚洲国产精品人人做人人爽| 亚洲视频久久久| av在线播放一区二区| 超碰97在线免费| 欧美日韩1区| 国产偷激情在线| 男人舔女人下部高潮全视频| 欧美亚洲精品天堂| 在线日韩av观看| 欧美伊久线香蕉线新在线| 国产高清免费视频| 亚洲精品国产熟女久久久| av日韩亚洲| 国产精品自在线拍| 天天干天天曰天天操| 亚洲精品一区二区在线播放∴| 国产成人天天5g影院在线观看| 精品日韩欧美一区二区| 国产成人精品在线播放| 欧美在线免费视屏| 欧美床上激情在线观看| 捆绑紧缚一区二区三区视频| 国产久一一精品| 国产精品无码一本二本三本色| jizzjizzjizz亚洲| 超碰在线首页| 亚洲男人第一av网站| 一区二区中文字幕| 亚洲午夜久久久久久久久红桃| 91av在线播放| av男人的天堂在线| 中文字幕一区二区三区手机版| 人妻视频一区二区| 日本精品久久久久久久久久| 久久久精品一品道一区| 污版视频在线观看| 欧美丝袜在线观看| 久久精品中文字幕| 男女视频网站在线观看| 久久精品a一级国产免视看成人| 久久精品视频日本| 丁香亚洲综合激情啪啪综合| 超碰在线视屏| 日韩一区二区精品视频| 国产xxxx视频| 69久久夜色精品国产69| 鲁鲁狠狠狠7777一区二区| 精品久久久久久久人人人人传媒| 亚洲深夜福利| www.亚洲| 视频在线观看99| 色爱av美腿丝袜综合粉嫩av| **毛片在线网站| 国产资源在线视频| 少妇高潮一区二区三区| 久久久综合久久久| 国产中文字幕91| 91制片在线观看| 久久精品国产亚洲精品2020| 久久中文字幕视频| 久久99精品久久久久久琪琪| 亚洲自拍偷拍福利| 亚洲一区欧美二区| 欧美国产日韩在线视频| 涩涩网在线视频| 成人写真视频| 91免费视频网站在线观看| 亚洲国产精品一区二区尤物区| 147欧美人体大胆444| 亚洲国产欧美日本视频| 国产三级日本三级在线播放| 天天干 夜夜操| 在线不卡视频| 国产人妻精品久久久久野外| www.99av.com| 日本一区二区三区在线视频| 亚洲欧美另类色图| 欧美亚洲激情在线| 爱啪啪综合导航| 欧美特级www| 欧美连裤袜在线视频| a级毛片免费高清视频| 波多野结衣在线观看| 国产真实乱子伦精品视频| 欧美草草影院在线视频| 欧美日韩一区二区三区在线| 亚洲色图综合久久| 免费看一级大黄情大片| 四虎精品视频| 99草在线视频| 超碰97免费观看| 91色琪琪电影亚洲精品久久| av动漫一区二区| 秋霞影院一区二区三区| 韩国日本一区二区三区| 91麻豆精品91久久久久同性| 日韩av大片在线观看| 亚洲国产精品无码观看久久| 国产高潮又爽又无遮挡又免费| 亚洲做受高潮无遮挡| 亚洲777理论| 最近2019年好看中文字幕视频| 福利视频在线导航| 日韩中文字幕在线观看视频| 欧美精品三级在线观看| 亚洲经典自拍| 久久影视三级福利片| 最新中文字幕视频| 国产欧美精品区一区二区三区| 日韩欧美一区在线| 黄色免费看网站| 久久都是精品| 成人激情小说乱人伦| 亚洲精品裸体| 亚洲午夜在线| 欧美色综合一区二区三区| 26uuu另类亚洲欧美日本一| 亚洲视频综合网| 国产一区二区视频免费在线观看| 污污的网站在线免费观看| 色综合久久综合网| 91夜夜未满十八勿入爽爽影院| 国产精品白丝一区二区三区| 欧美精品中文字幕亚洲专区| 婷婷成人av| 亚洲第一精品夜夜躁人人躁| 3d动漫精品啪啪一区二区三区免费| 网站免费在线观看| 午夜美女福利视频| 狠狠色狠狠色综合日日小说| www.玖玖玖| 欧洲成人午夜精品无码区久久| 亚洲av成人无码久久精品| 国产av无码专区亚洲av毛网站| 在线播放/欧美激情| 天堂久久精品忘忧草| 午夜精品久久久久久久96蜜桃| 日韩午夜电影在线观看| 91麻豆精品国产91久久久更新资源速度超快| 91国产一区在线| 亚洲国产激情| 外卖gayxxxxgay1| 91久久久久久久久久| 日本高清不卡在线观看| 中文在线最新版天堂8| 奇米影音第四色| 日本中文在线观看| 国产精品久久91| 天天操天天操天天| 亚洲一区二区三区无码久久| 99久久精品一区| 欧美日韩久久精品| 92看片淫黄大片看国产片| 懂色av一区二区三区免费观看| 精品国产视频在线观看| 久久精品视频网| 91精品在线播放| 黄色精品在线看| 老牛影视精品| 视频一区在线视频| 精品国产乱码久久久久久1区2匹| jizz18女人高潮| 亚洲精品成人天堂一二三| 欧美97人人模人人爽人人喊视频| 亚洲午夜精品17c| 久久午夜无码鲁丝片| 免费看日本一区二区| 国产精品久久久久久人| 亚洲女人初尝黑人巨大| 女同毛片一区二区三区| 撸视在线观看免费视频| 五月激情六月婷婷| 91丨九色丨黑人外教| 亚洲v欧美v另类v综合v日韩v| 欧美 日韩 国产 一区| 黄色一级大片在线免费观看| av福利导福航大全在线播放| 久久久国产精品成人免费| 欧美日韩精品免费观看视频| 日本美女爱爱视频| 国产一区激情| 18精品爽国产三级网站| 大片网站久久| 性生活免费观看视频| 成人免费直播live| 新天堂中文资源官网在线观看| 欧美视频xxx| 擼擼色在线看观看免费| 亚洲啊v在线| 亚洲国产午夜| 国产黄在线播放| 天堂一区二区在线免费观看| 亚洲911精品成人18网站| 欧洲杯足球赛直播| 亚洲 另类 春色 国产| av在线播放成人| 在线观看免费视频高清游戏推荐| 在线看成人av| 亚洲国产成人爱av在线播放| 一区二区网站| 欧美一级片一区| 天堂8中文在线| 一本一本久久a久久精品综合妖精| 色天使综合视频| 国产伦精品一区二区三区在线播放| 久久久久看片| 性猛交富婆╳xxx乱大交天津| 国产伦精品一区二区三区视频孕妇| 毛片网站在线免费观看| 日韩福利电影在线| 久久99久久99精品免观看粉嫩| 国产中文字幕免费| 久久夜色电影| 免费偷拍视频网站| 狠狠入ady亚洲精品经典电影| 日本欧美肥老太交大片| 欧美一区二区三区免费观看| 日日噜噜噜夜夜爽爽| 久久精品高清| 免费av在线网站| 色丁香婷婷综合久久| 久久色在线观看| 成人黄色免费片| 欧洲一区二区视频| 日韩精品永久网址| www.色偷偷.com| 日本在线播放一区二区三区| 男女激情免费视频| 男人天堂成人网| 在线欧美一区二区| 成年人免费网站在线观看| 蜜臀精品久久久久久蜜臀| 国产精品一区二区三区99| 日韩系列欧美系列| 69视频在线观看免费| 国产视频中文字幕| 一卡二卡三卡日韩欧美| 精品无码国产一区二区三区51安| 91动漫免费网站| 久久99久久98精品免观看软件| av在线播放观看| 欧美三级小说| 国产精品国产三级国产普通话对白| 国产h视频在线观看| 男插女视频久久久| 亚洲视频大全| 91成人入口| 福利片在线一区二区| 美女视频一区| 日韩大片在线播放| 欧美色欧美亚洲另类二区精品| 久热这里只精品99re8久| 国产黄色片在线免费观看| 亚洲人午夜精品| 亚洲剧情一区二区| 精品一区二区三区av| 欧美高清视频在线| 亚洲免费观看高清完整版在线观看熊| 日本黄色免费视频| 国产在线激情视频| 丝袜美腿成人在线| 日韩中文字幕免费观看| 成人不用播放器| 美女100%露胸无遮挡| 国产精品一区二区三区四| 成年美女黄网站色大片不卡| 中文字幕一区二区三区四区五区| 国产一区二区三区免费观看| 你真棒插曲来救救我在线观看| 日韩中文字幕麻豆| 成人性视频网站| 蜜桃专区在线| www.555国产精品免费| 国产老肥熟xxxx在线观看| 无码人妻丰满熟妇啪啪欧美| 日韩电影毛片| 国产精品91在线观看| 国产一区日韩二区欧美三区| 日韩a级黄色片| 在线精品视频一区二区三四| 亚洲一区二区欧美| 91免费小视频| 欧美精品乱码久久久久久按摩| 麻豆精品视频在线观看免费| www.日韩高清| 欧美精品激情在线| 成人精品aaaa网站| 亚洲人体大胆视频| 性色视频在线观看| 久久精品中文字幕一区二区三区| 亚洲国产精品二区|