02网络监听的建立.html 89 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889
  1. <!DOCTYPE HTML>
  2. <html lang="" >
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
  6. <title>02 网络监听的建立 · 高性能服务器开发 技术专栏</title>
  7. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  8. <meta name="description" content="">
  9. <meta name="generator" content="GitBook 3.2.3">
  10. <meta name="author" content="easy_coder">
  11. <link rel="stylesheet" href="../../gitbook/style.css">
  12. <link rel="stylesheet" href="../../gitbook/gitbook-plugin-chapter-fold/chapter-fold.css">
  13. <link rel="stylesheet" href="../../gitbook/gitbook-plugin-search-pro/search.css">
  14. <link rel="stylesheet" href="../../gitbook/gitbook-plugin-splitter/splitter.css">
  15. <link rel="stylesheet" href="../../gitbook/gitbook-plugin-back-to-top-button/plugin.css">
  16. <link rel="stylesheet" href="../../gitbook/gitbook-plugin-prism/prism.css">
  17. <link rel="stylesheet" href="../../gitbook/gitbook-plugin-tbfed-pagefooter/footer.css">
  18. <link rel="stylesheet" href="../../gitbook/gitbook-plugin-code/plugin.css">
  19. <link rel="stylesheet" href="../../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css">
  20. <link rel="stylesheet" href="../../gitbook/gitbook-plugin-fontsettings/website.css">
  21. <link rel="stylesheet" href="../../gitbook/gitbook-plugin-theme-fexa/fexa.css">
  22. <meta name="HandheldFriendly" content="true"/>
  23. <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
  24. <meta name="apple-mobile-web-app-capable" content="yes">
  25. <meta name="apple-mobile-web-app-status-bar-style" content="black">
  26. <link rel="apple-touch-icon-precomposed" sizes="152x152" href="../../gitbook/images/apple-touch-icon-precomposed-152.png">
  27. <link rel="shortcut icon" href="../../gitbook/images/favicon.ico" type="image/x-icon">
  28. <link rel="next" href="03网络连接建立.html" />
  29. <link rel="prev" href="01初始化参数解析.html" />
  30. </head>
  31. <body>
  32. <div class="book">
  33. <div class="header-inner">
  34. <!-- LOGO -->
  35. <div class="logo"></div>
  36. <span class="title"></span>
  37. <!-- Search -->
  38. <div id="book-search-input" role="search">
  39. <input type="text" placeholder="Type to search" />
  40. </div>
  41. <!-- Nav -->
  42. <ul class="header-nav">
  43. </ul>
  44. </div>
  45. <div class="book-summary">
  46. <div class="book-summary-title">文档目录</div>
  47. <nav role="navigation">
  48. <ul class="summary">
  49. <li class="header">Part I</li>
  50. <li class="chapter " data-level="1.1" data-path="../../">
  51. <a href="../../">
  52. Introduction
  53. </a>
  54. </li>
  55. <li class="chapter " data-level="1.2" data-path="../C++必知必会的知识点/">
  56. <a href="../C++必知必会的知识点/">
  57. C++必知必会的知识点
  58. </a>
  59. <ul class="articles">
  60. <li class="chapter " data-level="1.2.1" data-path="../C++必知必会的知识点/如何成为一名合格的CC++开发者?.html">
  61. <a href="../C++必知必会的知识点/如何成为一名合格的CC++开发者?.html">
  62. 如何成为一名合格的C/C++开发者?
  63. </a>
  64. </li>
  65. <li class="chapter " data-level="1.2.2" data-path="../C++必知必会的知识点/不定参数函数实现var_arg系列的宏.html">
  66. <a href="../C++必知必会的知识点/不定参数函数实现var_arg系列的宏.html">
  67. 不定参数函数实现var_arg系列的宏
  68. </a>
  69. </li>
  70. <li class="chapter " data-level="1.2.3" data-path="../C++必知必会的知识点/你一定要搞明白的C函数调用方式与栈原理.html">
  71. <a href="../C++必知必会的知识点/你一定要搞明白的C函数调用方式与栈原理.html">
  72. 你一定要搞明白的C函数调用方式与栈原理
  73. </a>
  74. </li>
  75. <li class="chapter " data-level="1.2.4" data-path="../C++必知必会的知识点/深入理解CC++中的指针.html">
  76. <a href="../C++必知必会的知识点/深入理解CC++中的指针.html">
  77. 深入理解C/C++中的指针
  78. </a>
  79. </li>
  80. <li class="chapter " data-level="1.2.5" data-path="../C++必知必会的知识点/详解C++11中的智能指针.html">
  81. <a href="../C++必知必会的知识点/详解C++11中的智能指针.html">
  82. 详解C++11中的智能指针
  83. </a>
  84. </li>
  85. <li class="chapter " data-level="1.2.6" data-path="../C++必知必会的知识点/C++17结构化绑定.html">
  86. <a href="../C++必知必会的知识点/C++17结构化绑定.html">
  87. C++17结构化绑定
  88. </a>
  89. </li>
  90. <li class="chapter " data-level="1.2.7" data-path="../C++必知必会的知识点/C++必须掌握的pimpl惯用法.html">
  91. <a href="../C++必知必会的知识点/C++必须掌握的pimpl惯用法.html">
  92. C++必须掌握的pimpl惯用法
  93. </a>
  94. </li>
  95. <li class="chapter " data-level="1.2.8" data-path="../C++必知必会的知识点/用VisualStudio调试Linux程序.html">
  96. <a href="../C++必知必会的知识点/用VisualStudio调试Linux程序.html">
  97. 用Visual Studio调试Linux程序
  98. </a>
  99. </li>
  100. <li class="chapter " data-level="1.2.9" data-path="../C++必知必会的知识点/如何使用VisualStudio管理和阅读开源项目代码.html">
  101. <a href="../C++必知必会的知识点/如何使用VisualStudio管理和阅读开源项目代码.html">
  102. 如何使用Visual Studio管理和阅读开源项目代码
  103. </a>
  104. </li>
  105. <li class="chapter " data-level="1.2.10" data-path="../C++必知必会的知识点/利用cmake工具生成VisualStudio工程文件.html">
  106. <a href="../C++必知必会的知识点/利用cmake工具生成VisualStudio工程文件.html">
  107. 利用cmake工具生成Visual Studio工程文件
  108. </a>
  109. </li>
  110. </ul>
  111. </li>
  112. <li class="chapter " data-level="1.3" data-path="../多线程/">
  113. <a href="../多线程/">
  114. 多线程
  115. </a>
  116. <ul class="articles">
  117. <li class="chapter " data-level="1.3.1" data-path="../多线程/后台C++开发你一定要知道的条件变量.html">
  118. <a href="../多线程/后台C++开发你一定要知道的条件变量.html">
  119. 后台C++开发你一定要知道的条件变量
  120. </a>
  121. </li>
  122. <li class="chapter " data-level="1.3.2" data-path="../多线程/整型变量赋值是原子操作吗?.html">
  123. <a href="../多线程/整型变量赋值是原子操作吗?.html">
  124. 整型变量赋值是原子操作吗?
  125. </a>
  126. </li>
  127. </ul>
  128. </li>
  129. <li class="divider"></li>
  130. <li class="chapter " data-level="2.1" data-path="../网络编程/">
  131. <a href="../网络编程/">
  132. 网络编程
  133. </a>
  134. <ul class="articles">
  135. <li class="chapter " data-level="2.1.1" data-path="../网络编程/bind函数重难点解析.html">
  136. <a href="../网络编程/bind函数重难点解析.html">
  137. bind 函数重难点解析
  138. </a>
  139. </li>
  140. <li class="chapter " data-level="2.1.2" data-path="../网络编程/connect函数在阻塞和非阻塞模式下的行为.html">
  141. <a href="../网络编程/connect函数在阻塞和非阻塞模式下的行为.html">
  142. connect 函数在阻塞和非阻塞模式下的行为
  143. </a>
  144. </li>
  145. <li class="chapter " data-level="2.1.3" data-path="../网络编程/select函数重难点解析.html">
  146. <a href="../网络编程/select函数重难点解析.html">
  147. select 函数重难点解析
  148. </a>
  149. </li>
  150. <li class="chapter " data-level="2.1.4" data-path="../网络编程/Linuxepoll模型(含LT模式和ET模式详解).html">
  151. <a href="../网络编程/Linuxepoll模型(含LT模式和ET模式详解).html">
  152. Linux epoll 模型(含LT 模式和 ET 模式详解)
  153. </a>
  154. </li>
  155. <li class="chapter " data-level="2.1.5" data-path="../网络编程/socket的阻塞模式和非阻塞模式.html">
  156. <a href="../网络编程/socket的阻塞模式和非阻塞模式.html">
  157. socket 的阻塞模式和非阻塞模式
  158. </a>
  159. </li>
  160. <li class="chapter " data-level="2.1.6" data-path="../网络编程/非阻塞模式下send和recv函数的返回值.html">
  161. <a href="../网络编程/非阻塞模式下send和recv函数的返回值.html">
  162. 非阻塞模式下 send 和 recv 函数的返回值
  163. </a>
  164. </li>
  165. <li class="chapter " data-level="2.1.7" data-path="../网络编程/服务器开发通信协议设计介绍.html">
  166. <a href="../网络编程/服务器开发通信协议设计介绍.html">
  167. 服务器开发通信协议设计介绍
  168. </a>
  169. </li>
  170. <li class="chapter " data-level="2.1.8" data-path="../网络编程/TCP协议如何解决粘包、半包问题.html">
  171. <a href="../网络编程/TCP协议如何解决粘包、半包问题.html">
  172. TCP 协议如何解决粘包、半包问题
  173. </a>
  174. </li>
  175. <li class="chapter " data-level="2.1.9" data-path="../网络编程/网络通信中收发数据的正确姿势.html">
  176. <a href="../网络编程/网络通信中收发数据的正确姿势.html">
  177. 网络通信中收发数据的正确姿势
  178. </a>
  179. </li>
  180. <li class="chapter " data-level="2.1.10" data-path="../网络编程/服务器端发数据时,如果对端一直不收,怎么办?.html">
  181. <a href="../网络编程/服务器端发数据时,如果对端一直不收,怎么办?.html">
  182. 服务器端发数据时,如果对端一直不收,怎么办?
  183. </a>
  184. </li>
  185. </ul>
  186. </li>
  187. <li class="divider"></li>
  188. <li class="chapter " data-level="3.1" data-path="../程序员必知必会的网络命令/">
  189. <a href="../程序员必知必会的网络命令/">
  190. 程序员必知必会的网络命令
  191. </a>
  192. <ul class="articles">
  193. <li class="chapter " data-level="3.1.1" data-path="../程序员必知必会的网络命令/利用telnet命令发电子邮件.html">
  194. <a href="../程序员必知必会的网络命令/利用telnet命令发电子邮件.html">
  195. 利用telnet命令发电子邮件
  196. </a>
  197. </li>
  198. <li class="chapter " data-level="3.1.2" data-path="../程序员必知必会的网络命令/做Java或者C++开发都应该知道的lsof命令.html">
  199. <a href="../程序员必知必会的网络命令/做Java或者C++开发都应该知道的lsof命令.html">
  200. 做Java或者C++开发都应该知道的lsof命令
  201. </a>
  202. </li>
  203. <li class="chapter " data-level="3.1.3" data-path="../程序员必知必会的网络命令/Linux网络故障排查的瑞士军刀.html">
  204. <a href="../程序员必知必会的网络命令/Linux网络故障排查的瑞士军刀.html">
  205. Linux网络故障排查的瑞士军刀nc命令
  206. </a>
  207. </li>
  208. <li class="chapter " data-level="3.1.4" data-path="../程序员必知必会的网络命令/Linuxtcpdump使用介绍.html">
  209. <a href="../程序员必知必会的网络命令/Linuxtcpdump使用介绍.html">
  210. Linux tcpdump使用详解
  211. </a>
  212. </li>
  213. <li class="chapter " data-level="3.1.5" data-path="../程序员必知必会的网络命令/从抓包的角度分析connect函数的连接过程.html">
  214. <a href="../程序员必知必会的网络命令/从抓包的角度分析connect函数的连接过程.html">
  215. 从抓包的角度分析connect函数的连接过程
  216. </a>
  217. </li>
  218. <li class="chapter " data-level="3.1.6" data-path="../程序员必知必会的网络命令/服务器开发中网络数据分析与故障排查经验漫谈.html">
  219. <a href="../程序员必知必会的网络命令/服务器开发中网络数据分析与故障排查经验漫谈.html">
  220. 服务器开发中网络数据分析与故障排查经验漫谈
  221. </a>
  222. </li>
  223. </ul>
  224. </li>
  225. <li class="header">Part II</li>
  226. <li class="chapter " data-level="4.1" data-path="../高性能服务器框架设计/">
  227. <a href="../高性能服务器框架设计/">
  228. 高性能服务器框架设计
  229. </a>
  230. <ul class="articles">
  231. <li class="chapter " data-level="4.1.1" data-path="../高性能服务器框架设计/主线程与工作线程的分工.html">
  232. <a href="../高性能服务器框架设计/主线程与工作线程的分工.html">
  233. 主线程与工作线程的分工
  234. </a>
  235. </li>
  236. <li class="chapter " data-level="4.1.2" data-path="../高性能服务器框架设计/Reactor模式.html">
  237. <a href="../高性能服务器框架设计/Reactor模式.html">
  238. Reactor模式
  239. </a>
  240. </li>
  241. <li class="chapter " data-level="4.1.3" data-path="../高性能服务器框架设计/实例:一个服务器程序的架构介绍.html">
  242. <a href="../高性能服务器框架设计/实例:一个服务器程序的架构介绍.html">
  243. 实例:一个服务器程序的架构介绍
  244. </a>
  245. </li>
  246. <li class="chapter " data-level="4.1.4" data-path="../高性能服务器框架设计/错误码系统的设计.html">
  247. <a href="../高性能服务器框架设计/错误码系统的设计.html">
  248. 错误码系统的设计
  249. </a>
  250. </li>
  251. <li class="chapter " data-level="4.1.5" data-path="../高性能服务器框架设计/日志系统的设计.html">
  252. <a href="../高性能服务器框架设计/日志系统的设计.html">
  253. 日志系统的设计
  254. </a>
  255. </li>
  256. <li class="chapter " data-level="4.1.6" data-path="../高性能服务器框架设计/如何设计断线自动重连机制.html">
  257. <a href="../高性能服务器框架设计/如何设计断线自动重连机制.html">
  258. 如何设计断线自动重连机制
  259. </a>
  260. </li>
  261. <li class="chapter " data-level="4.1.7" data-path="../高性能服务器框架设计/心跳包机制设计详解.html">
  262. <a href="../高性能服务器框架设计/心跳包机制设计详解.html">
  263. 心跳包机制设计详解
  264. </a>
  265. </li>
  266. <li class="chapter " data-level="4.1.8" data-path="../高性能服务器框架设计/业务数据处理一定要单独开线程吗.html">
  267. <a href="../高性能服务器框架设计/业务数据处理一定要单独开线程吗.html">
  268. 业务数据处理一定要单独开线程吗
  269. </a>
  270. </li>
  271. <li class="chapter " data-level="4.1.9" data-path="../高性能服务器框架设计/C++高性能服务器网络框架设计细节.html">
  272. <a href="../高性能服务器框架设计/C++高性能服务器网络框架设计细节.html">
  273. C++ 高性能服务器网络框架设计细节
  274. </a>
  275. </li>
  276. </ul>
  277. </li>
  278. <li class="divider"></li>
  279. <li class="chapter " data-level="5.1" data-path="../服务器开发案例实战/">
  280. <a href="../服务器开发案例实战/">
  281. 服务器开发案例实战
  282. </a>
  283. <ul class="articles">
  284. <li class="chapter " data-level="5.1.1" data-path="../服务器开发案例实战/从零实现一个http服务器.html">
  285. <a href="../服务器开发案例实战/从零实现一个http服务器.html">
  286. 从零实现一个http服务器
  287. </a>
  288. </li>
  289. <li class="chapter " data-level="5.1.2" data-path="../服务器开发案例实战/从零实现一款12306刷票软件.html">
  290. <a href="../服务器开发案例实战/从零实现一款12306刷票软件.html">
  291. 从零实现一款12306刷票软件
  292. </a>
  293. </li>
  294. <li class="chapter " data-level="5.1.3" data-path="../服务器开发案例实战/从零实现一个邮件收发客户端.html">
  295. <a href="../服务器开发案例实战/从零实现一个邮件收发客户端.html">
  296. 从零实现一个邮件收发客户端
  297. </a>
  298. </li>
  299. <li class="chapter " data-level="5.1.4" data-path="../服务器开发案例实战/从零开发一个WebSocket服务器.html">
  300. <a href="../服务器开发案例实战/从零开发一个WebSocket服务器.html">
  301. 从零开发一个WebSocket服务器
  302. </a>
  303. </li>
  304. <li class="chapter " data-level="5.1.5" data-path="../服务器开发案例实战/1从一款多人联机实时对战游戏开始.html">
  305. <a href="../服务器开发案例实战/1从一款多人联机实时对战游戏开始.html">
  306. 从零学习开源项目系列(一) 从一款多人联机实时对战游戏开始
  307. </a>
  308. </li>
  309. <li class="chapter " data-level="5.1.6" data-path="../服务器开发案例实战/2最后一战概况.html">
  310. <a href="../服务器开发案例实战/2最后一战概况.html">
  311. 从零学习开源项目系列(二) 最后一战概况
  312. </a>
  313. </li>
  314. <li class="chapter " data-level="5.1.7" data-path="../服务器开发案例实战/3CSBattleMgr服务源码研究.html">
  315. <a href="../服务器开发案例实战/3CSBattleMgr服务源码研究.html">
  316. 从零学习开源项目系列(三) CSBattleMgr服务源码研究
  317. </a>
  318. </li>
  319. <li class="chapter " data-level="5.1.8" data-path="../服务器开发案例实战/4LogServer源码探究.html">
  320. <a href="../服务器开发案例实战/4LogServer源码探究.html">
  321. 从零学习开源项目系列(四)LogServer源码探究
  322. </a>
  323. </li>
  324. </ul>
  325. </li>
  326. <li class="header">Part III</li>
  327. <li class="chapter " data-level="6.1" data-path="../TeamTalk源码解析/">
  328. <a href="../TeamTalk源码解析/">
  329. TeamTalk IM源码分析
  330. </a>
  331. <ul class="articles">
  332. <li class="chapter " data-level="6.1.1" data-path="../TeamTalk源码解析/01TeamTalk介绍.html">
  333. <a href="../TeamTalk源码解析/01TeamTalk介绍.html">
  334. 01 TeamTalk介绍
  335. </a>
  336. </li>
  337. <li class="chapter " data-level="6.1.2" data-path="../TeamTalk源码解析/02服务器端的程序的编译与部署.html">
  338. <a href="../TeamTalk源码解析/02服务器端的程序的编译与部署.html">
  339. 02 服务器端的程序的编译与部署
  340. </a>
  341. </li>
  342. <li class="chapter " data-level="6.1.3" data-path="../TeamTalk源码解析/03服务器端的程序架构介绍.html">
  343. <a href="../TeamTalk源码解析/03服务器端的程序架构介绍.html">
  344. 03 服务器端的程序架构介绍
  345. </a>
  346. </li>
  347. <li class="chapter " data-level="6.1.4" data-path="../TeamTalk源码解析/04服务器端db_proxy_server源码分析.html">
  348. <a href="../TeamTalk源码解析/04服务器端db_proxy_server源码分析.html">
  349. 04 服务器端db_proxy_server源码分析
  350. </a>
  351. </li>
  352. <li class="chapter " data-level="6.1.5" data-path="../TeamTalk源码解析/05服务器端msg_server源码分析.html">
  353. <a href="../TeamTalk源码解析/05服务器端msg_server源码分析.html">
  354. 05 服务器端msg_server源码分析
  355. </a>
  356. </li>
  357. <li class="chapter " data-level="6.1.6" data-path="../TeamTalk源码解析/06服务器端login_server源码分析.html">
  358. <a href="../TeamTalk源码解析/06服务器端login_server源码分析.html">
  359. 06 服务器端login_server源码分析
  360. </a>
  361. </li>
  362. <li class="chapter " data-level="6.1.7" data-path="../TeamTalk源码解析/07服务器端msfs源码分析.html">
  363. <a href="../TeamTalk源码解析/07服务器端msfs源码分析.html">
  364. 07 服务器端msfs源码分析
  365. </a>
  366. </li>
  367. <li class="chapter " data-level="6.1.8" data-path="../TeamTalk源码解析/08服务器端file_server源码分析.html">
  368. <a href="../TeamTalk源码解析/08服务器端file_server源码分析.html">
  369. 08 服务器端file_server源码分析
  370. </a>
  371. </li>
  372. <li class="chapter " data-level="6.1.9" data-path="../TeamTalk源码解析/09服务器端route_server源码分析.html">
  373. <a href="../TeamTalk源码解析/09服务器端route_server源码分析.html">
  374. 09 服务器端route_server源码分析
  375. </a>
  376. </li>
  377. <li class="chapter " data-level="6.1.10" data-path="../TeamTalk源码解析/10开放一个TeamTalk测试服务器地址和几个测试账号.html">
  378. <a href="../TeamTalk源码解析/10开放一个TeamTalk测试服务器地址和几个测试账号.html">
  379. 10 开放一个TeamTalk测试服务器地址和几个测试账号
  380. </a>
  381. </li>
  382. <li class="chapter " data-level="6.1.11" data-path="../TeamTalk源码解析/11pc客户端源码分析.html">
  383. <a href="../TeamTalk源码解析/11pc客户端源码分析.html">
  384. 11 pc客户端源码分析
  385. </a>
  386. </li>
  387. </ul>
  388. </li>
  389. <li class="divider"></li>
  390. <li class="chapter " data-level="7.1" data-path="../libevent源码深度剖析/">
  391. <a href="../libevent源码深度剖析/">
  392. libevent源码深度剖析
  393. </a>
  394. <ul class="articles">
  395. <li class="chapter " data-level="7.1.1" data-path="../libevent源码深度剖析/libevent源码深度剖析01.html">
  396. <a href="../libevent源码深度剖析/libevent源码深度剖析01.html">
  397. libevent源码深度剖析01
  398. </a>
  399. </li>
  400. <li class="chapter " data-level="7.1.2" data-path="../libevent源码深度剖析/libevent源码深度剖析02.html">
  401. <a href="../libevent源码深度剖析/libevent源码深度剖析02.html">
  402. libevent源码深度剖析02
  403. </a>
  404. </li>
  405. <li class="chapter " data-level="7.1.3" data-path="../libevent源码深度剖析/libevent源码深度剖析03.html">
  406. <a href="../libevent源码深度剖析/libevent源码深度剖析03.html">
  407. libevent源码深度剖析03
  408. </a>
  409. </li>
  410. <li class="chapter " data-level="7.1.4" data-path="../libevent源码深度剖析/libevent源码深度剖析04.html">
  411. <a href="../libevent源码深度剖析/libevent源码深度剖析04.html">
  412. libevent源码深度剖析04
  413. </a>
  414. </li>
  415. <li class="chapter " data-level="7.1.5" data-path="../libevent源码深度剖析/libevent源码深度剖析05.html">
  416. <a href="../libevent源码深度剖析/libevent源码深度剖析05.html">
  417. libevent源码深度剖析05
  418. </a>
  419. </li>
  420. <li class="chapter " data-level="7.1.6" data-path="../libevent源码深度剖析/libevent源码深度剖析06.html">
  421. <a href="../libevent源码深度剖析/libevent源码深度剖析06.html">
  422. libevent源码深度剖析06
  423. </a>
  424. </li>
  425. <li class="chapter " data-level="7.1.7" data-path="../libevent源码深度剖析/libevent源码深度剖析07.html">
  426. <a href="../libevent源码深度剖析/libevent源码深度剖析07.html">
  427. libevent源码深度剖析07
  428. </a>
  429. </li>
  430. <li class="chapter " data-level="7.1.8" data-path="../libevent源码深度剖析/libevent源码深度剖析08.html">
  431. <a href="../libevent源码深度剖析/libevent源码深度剖析08.html">
  432. libevent源码深度剖析08
  433. </a>
  434. </li>
  435. <li class="chapter " data-level="7.1.9" data-path="../libevent源码深度剖析/libevent源码深度剖析09.html">
  436. <a href="../libevent源码深度剖析/libevent源码深度剖析09.html">
  437. libevent源码深度剖析09
  438. </a>
  439. </li>
  440. <li class="chapter " data-level="7.1.10" data-path="../libevent源码深度剖析/libevent源码深度剖析10.html">
  441. <a href="../libevent源码深度剖析/libevent源码深度剖析10.html">
  442. libevent源码深度剖析10
  443. </a>
  444. </li>
  445. <li class="chapter " data-level="7.1.11" data-path="../libevent源码深度剖析/libevent源码深度剖析11.html">
  446. <a href="../libevent源码深度剖析/libevent源码深度剖析11.html">
  447. libevent源码深度剖析11
  448. </a>
  449. </li>
  450. <li class="chapter " data-level="7.1.12" data-path="../libevent源码深度剖析/libevent源码深度剖析12.html">
  451. <a href="../libevent源码深度剖析/libevent源码深度剖析12.html">
  452. libevent源码深度剖析12
  453. </a>
  454. </li>
  455. <li class="chapter " data-level="7.1.13" data-path="../libevent源码深度剖析/libevent源码深度剖析13.html">
  456. <a href="../libevent源码深度剖析/libevent源码深度剖析13.html">
  457. libevent源码深度剖析13
  458. </a>
  459. </li>
  460. </ul>
  461. </li>
  462. <li class="chapter " data-level="7.2" data-path="../leveldb源码分析/">
  463. <a href="../leveldb源码分析/">
  464. leveldb源码分析
  465. </a>
  466. <ul class="articles">
  467. <li class="chapter " data-level="7.2.1" data-path="../leveldb源码分析/leveldb源码分析1.html">
  468. <a href="../leveldb源码分析/leveldb源码分析1.html">
  469. leveldb源码分析1
  470. </a>
  471. </li>
  472. <li class="chapter " data-level="7.2.2" data-path="../leveldb源码分析/leveldb源码分析2.html">
  473. <a href="../leveldb源码分析/leveldb源码分析2.html">
  474. leveldb源码分析2
  475. </a>
  476. </li>
  477. <li class="chapter " data-level="7.2.3" data-path="../leveldb源码分析/leveldb源码分析3.html">
  478. <a href="../leveldb源码分析/leveldb源码分析3.html">
  479. leveldb源码分析3
  480. </a>
  481. </li>
  482. <li class="chapter " data-level="7.2.4" data-path="../leveldb源码分析/leveldb源码分析4.html">
  483. <a href="../leveldb源码分析/leveldb源码分析4.html">
  484. leveldb源码分析4
  485. </a>
  486. </li>
  487. <li class="chapter " data-level="7.2.5" data-path="../leveldb源码分析/leveldb源码分析5.html">
  488. <a href="../leveldb源码分析/leveldb源码分析5.html">
  489. leveldb源码分析5
  490. </a>
  491. </li>
  492. <li class="chapter " data-level="7.2.6" data-path="../leveldb源码分析/leveldb源码分析6.html">
  493. <a href="../leveldb源码分析/leveldb源码分析6.html">
  494. leveldb源码分析6
  495. </a>
  496. </li>
  497. <li class="chapter " data-level="7.2.7" data-path="../leveldb源码分析/leveldb源码分析7.html">
  498. <a href="../leveldb源码分析/leveldb源码分析7.html">
  499. leveldb源码分析7
  500. </a>
  501. </li>
  502. <li class="chapter " data-level="7.2.8" data-path="../leveldb源码分析/leveldb源码分析8.html">
  503. <a href="../leveldb源码分析/leveldb源码分析8.html">
  504. leveldb源码分析8
  505. </a>
  506. </li>
  507. <li class="chapter " data-level="7.2.9" data-path="../leveldb源码分析/leveldb源码分析9.html">
  508. <a href="../leveldb源码分析/leveldb源码分析9.html">
  509. leveldb源码分析9
  510. </a>
  511. </li>
  512. <li class="chapter " data-level="7.2.10" data-path="../leveldb源码分析/leveldb源码分析10.html">
  513. <a href="../leveldb源码分析/leveldb源码分析10.html">
  514. leveldb源码分析10
  515. </a>
  516. </li>
  517. <li class="chapter " data-level="7.2.11" data-path="../leveldb源码分析/leveldb源码分析11.html">
  518. <a href="../leveldb源码分析/leveldb源码分析11.html">
  519. leveldb源码分析11
  520. </a>
  521. </li>
  522. <li class="chapter " data-level="7.2.12" data-path="../leveldb源码分析/leveldb源码分析12.html">
  523. <a href="../leveldb源码分析/leveldb源码分析12.html">
  524. leveldb源码分析12
  525. </a>
  526. </li>
  527. <li class="chapter " data-level="7.2.13" data-path="../leveldb源码分析/leveldb源码分析13.html">
  528. <a href="../leveldb源码分析/leveldb源码分析13.html">
  529. leveldb源码分析13
  530. </a>
  531. </li>
  532. <li class="chapter " data-level="7.2.14" data-path="../leveldb源码分析/leveldb源码分析14.html">
  533. <a href="../leveldb源码分析/leveldb源码分析14.html">
  534. leveldb源码分析14
  535. </a>
  536. </li>
  537. <li class="chapter " data-level="7.2.15" data-path="../leveldb源码分析/leveldb源码分析15.html">
  538. <a href="../leveldb源码分析/leveldb源码分析15.html">
  539. leveldb源码分析15
  540. </a>
  541. </li>
  542. <li class="chapter " data-level="7.2.16" data-path="../leveldb源码分析/leveldb源码分析16.html">
  543. <a href="../leveldb源码分析/leveldb源码分析16.html">
  544. leveldb源码分析16
  545. </a>
  546. </li>
  547. <li class="chapter " data-level="7.2.17" data-path="../leveldb源码分析/leveldb源码分析17.html">
  548. <a href="../leveldb源码分析/leveldb源码分析17.html">
  549. leveldb源码分析17
  550. </a>
  551. </li>
  552. <li class="chapter " data-level="7.2.18" data-path="../leveldb源码分析/leveldb源码分析18.html">
  553. <a href="../leveldb源码分析/leveldb源码分析18.html">
  554. leveldb源码分析18
  555. </a>
  556. </li>
  557. <li class="chapter " data-level="7.2.19" data-path="../leveldb源码分析/leveldb源码分析19.html">
  558. <a href="../leveldb源码分析/leveldb源码分析19.html">
  559. leveldb源码分析19
  560. </a>
  561. </li>
  562. <li class="chapter " data-level="7.2.20" data-path="../leveldb源码分析/leveldb源码分析20.html">
  563. <a href="../leveldb源码分析/leveldb源码分析20.html">
  564. leveldb源码分析20
  565. </a>
  566. </li>
  567. <li class="chapter " data-level="7.2.21" data-path="../leveldb源码分析/leveldb源码分析21.html">
  568. <a href="../leveldb源码分析/leveldb源码分析21.html">
  569. leveldb源码分析21
  570. </a>
  571. </li>
  572. <li class="chapter " data-level="7.2.22" data-path="../leveldb源码分析/leveldb源码分析22.html">
  573. <a href="../leveldb源码分析/leveldb源码分析22.html">
  574. leveldb源码分析22
  575. </a>
  576. </li>
  577. </ul>
  578. </li>
  579. <li class="divider"></li>
  580. <li class="chapter " data-level="8.1" data-path="./">
  581. <a href="./">
  582. Memcached源码分析
  583. </a>
  584. <ul class="articles">
  585. <li class="chapter " data-level="8.1.1" data-path="00服务器资源调整.html">
  586. <a href="00服务器资源调整.html">
  587. 00 服务器资源调整
  588. </a>
  589. </li>
  590. <li class="chapter " data-level="8.1.2" data-path="01初始化参数解析.html">
  591. <a href="01初始化参数解析.html">
  592. 01 初始化参数解析
  593. </a>
  594. </li>
  595. <li class="chapter active" data-level="8.1.3" data-path="02网络监听的建立.html">
  596. <a href="02网络监听的建立.html">
  597. 02 网络监听的建立
  598. </a>
  599. </li>
  600. <li class="chapter " data-level="8.1.4" data-path="03网络连接建立.html">
  601. <a href="03网络连接建立.html">
  602. 03 网络连接建立
  603. </a>
  604. </li>
  605. <li class="chapter " data-level="8.1.5" data-path="04内存初始化.html">
  606. <a href="04内存初始化.html">
  607. 04 内存初始化
  608. </a>
  609. </li>
  610. <li class="chapter " data-level="8.1.6" data-path="05资源初始化.html">
  611. <a href="05资源初始化.html">
  612. 05 资源初始化
  613. </a>
  614. </li>
  615. <li class="chapter " data-level="8.1.7" data-path="06get过程.html">
  616. <a href="06get过程.html">
  617. 06 get过程
  618. </a>
  619. </li>
  620. <li class="chapter " data-level="8.1.8" data-path="07cas属性.html">
  621. <a href="07cas属性.html">
  622. 07 cas属性
  623. </a>
  624. </li>
  625. <li class="chapter " data-level="8.1.9" data-path="08内存池.html">
  626. <a href="08内存池.html">
  627. 08 内存池
  628. </a>
  629. </li>
  630. <li class="chapter " data-level="8.1.10" data-path="09连接队列.html">
  631. <a href="09连接队列.html">
  632. 09 连接队列
  633. </a>
  634. </li>
  635. <li class="chapter " data-level="8.1.11" data-path="10Hash表操作.html">
  636. <a href="10Hash表操作.html">
  637. 10 Hash表操作
  638. </a>
  639. </li>
  640. <li class="chapter " data-level="8.1.12" data-path="12set操作.html">
  641. <a href="12set操作.html">
  642. 12 set操作
  643. </a>
  644. </li>
  645. <li class="chapter " data-level="8.1.13" data-path="13do_item_alloc操作.html">
  646. <a href="13do_item_alloc操作.html">
  647. 13 do_item_alloc操作
  648. </a>
  649. </li>
  650. <li class="chapter " data-level="8.1.14" data-path="14item结构.html">
  651. <a href="14item结构.html">
  652. 14 item结构
  653. </a>
  654. </li>
  655. <li class="chapter " data-level="8.1.15" data-path="15Hash表扩容.html">
  656. <a href="15Hash表扩容.html">
  657. 15 Hash表扩容
  658. </a>
  659. </li>
  660. <li class="chapter " data-level="8.1.16" data-path="16线程交互.html">
  661. <a href="16线程交互.html">
  662. 16 线程交互
  663. </a>
  664. </li>
  665. <li class="chapter " data-level="8.1.17" data-path="17状态机.html">
  666. <a href="17状态机.html">
  667. 17 状态机
  668. </a>
  669. </li>
  670. </ul>
  671. </li>
  672. <li class="divider"></li>
  673. <li class="chapter " data-level="9.1" data-path="../游戏开发专题/">
  674. <a href="../游戏开发专题/">
  675. 游戏开发专题
  676. </a>
  677. <ul class="articles">
  678. <li class="chapter " data-level="9.1.1" data-path="../游戏开发专题/1游戏服务器开发的基本体系与服务器端开发的一些建议.html">
  679. <a href="../游戏开发专题/1游戏服务器开发的基本体系与服务器端开发的一些建议.html">
  680. 1 游戏服务器开发的基本体系与服务器端开发的一些建议
  681. </a>
  682. </li>
  683. <li class="chapter " data-level="9.1.2" data-path="../游戏开发专题/2网络游戏服务器开发框架设计介绍.html">
  684. <a href="../游戏开发专题/2网络游戏服务器开发框架设计介绍.html">
  685. 2 网络游戏服务器开发框架设计介绍
  686. </a>
  687. </li>
  688. <li class="chapter " data-level="9.1.3" data-path="../游戏开发专题/3游戏后端开发需要掌握的知识.html">
  689. <a href="../游戏开发专题/3游戏后端开发需要掌握的知识.html">
  690. 3 游戏后端开发需要掌握的知识
  691. </a>
  692. </li>
  693. <li class="chapter " data-level="9.1.4" data-path="../游戏开发专题/4关于游戏服务端架构的整理.html">
  694. <a href="../游戏开发专题/4关于游戏服务端架构的整理.html">
  695. 4 关于游戏服务端架构的整理
  696. </a>
  697. </li>
  698. <li class="chapter " data-level="9.1.5" data-path="../游戏开发专题/5各类游戏对应的服务端架构.html">
  699. <a href="../游戏开发专题/5各类游戏对应的服务端架构.html">
  700. 5 各类游戏对应的服务端架构
  701. </a>
  702. </li>
  703. <li class="chapter " data-level="9.1.6" data-path="../游戏开发专题/6从腾讯QQgame高性能服务器集群架构看“分而治之”与“自治”等分布式架构设计原则.html">
  704. <a href="../游戏开发专题/6从腾讯QQgame高性能服务器集群架构看“分而治之”与“自治”等分布式架构设计原则.html">
  705. 6 从腾讯QQgame高性能服务器集群架构看“分而治之”与“自治”等分布式架构设计原则
  706. </a>
  707. </li>
  708. <li class="chapter " data-level="9.1.7" data-path="../游戏开发专题/7QQ游戏百万人同时在线服务器架构实现.html">
  709. <a href="../游戏开发专题/7QQ游戏百万人同时在线服务器架构实现.html">
  710. 7 QQ游戏百万人同时在线服务器架构实现
  711. </a>
  712. </li>
  713. <li class="chapter " data-level="9.1.8" data-path="../游戏开发专题/8大型多人在线游戏服务器架构设计.html">
  714. <a href="../游戏开发专题/8大型多人在线游戏服务器架构设计.html">
  715. 8 大型多人在线游戏服务器架构设计
  716. </a>
  717. </li>
  718. <li class="chapter " data-level="9.1.9" data-path="../游戏开发专题/9百万用户级游戏服务器架构设计.html">
  719. <a href="../游戏开发专题/9百万用户级游戏服务器架构设计.html">
  720. 9 百万用户级游戏服务器架构设计
  721. </a>
  722. </li>
  723. <li class="chapter " data-level="9.1.10" data-path="../游戏开发专题/10十万在线的WebGame的数据库设计思路.html">
  724. <a href="../游戏开发专题/10十万在线的WebGame的数据库设计思路.html">
  725. 10 十万在线的WebGame的数据库设计思路
  726. </a>
  727. </li>
  728. <li class="chapter " data-level="9.1.11" data-path="../游戏开发专题/11一种高性能网络游戏服务器架构设计.html">
  729. <a href="../游戏开发专题/11一种高性能网络游戏服务器架构设计.html">
  730. 11 一种高性能网络游戏服务器架构设计
  731. </a>
  732. </li>
  733. <li class="chapter " data-level="9.1.12" data-path="../游戏开发专题/12经典游戏服务器端架构概述.html">
  734. <a href="../游戏开发专题/12经典游戏服务器端架构概述.html">
  735. 12 经典游戏服务器端架构概述
  736. </a>
  737. </li>
  738. <li class="chapter " data-level="9.1.13" data-path="../游戏开发专题/13游戏跨服架构进化之路.html">
  739. <a href="../游戏开发专题/13游戏跨服架构进化之路.html">
  740. 13 游戏跨服架构进化之路
  741. </a>
  742. </li>
  743. </ul>
  744. </li>
  745. <li class="header">Part IV</li>
  746. <li class="chapter " data-level="10.1" data-path="../程序员面试题精讲/">
  747. <a href="../程序员面试题精讲/">
  748. 程序员面试题精讲
  749. </a>
  750. <ul class="articles">
  751. <li class="chapter " data-level="10.1.1" data-path="../程序员面试题精讲/腾讯后台开发实习生技能要求.html">
  752. <a href="../程序员面试题精讲/腾讯后台开发实习生技能要求.html">
  753. 腾讯后台开发实习生技能要求
  754. </a>
  755. </li>
  756. <li class="chapter " data-level="10.1.2" data-path="../程序员面试题精讲/聊聊如何拿大厂的offer.html">
  757. <a href="../程序员面试题精讲/聊聊如何拿大厂的offer.html">
  758. 聊聊如何拿大厂的 offer
  759. </a>
  760. </li>
  761. <li class="chapter " data-level="10.1.3" data-path="../程序员面试题精讲/网络通信题目集锦.html">
  762. <a href="../程序员面试题精讲/网络通信题目集锦.html">
  763. 网络通信题目集锦
  764. </a>
  765. </li>
  766. <li class="chapter " data-level="10.1.4" data-path="../程序员面试题精讲/我面试后端开发经理的经历.html">
  767. <a href="../程序员面试题精讲/我面试后端开发经理的经历.html">
  768. 我面试后端开发经理的经历
  769. </a>
  770. </li>
  771. <li class="chapter " data-level="10.1.5" data-path="../程序员面试题精讲/LinuxCC++后端开发面试问哪些问题.html">
  772. <a href="../程序员面试题精讲/LinuxCC++后端开发面试问哪些问题.html">
  773. Linux C/C++后端开发面试问哪些问题
  774. </a>
  775. </li>
  776. </ul>
  777. </li>
  778. <li class="chapter " data-level="10.2" data-path="../职业规划/">
  779. <a href="../职业规划/">
  780. 职业规划
  781. </a>
  782. <ul class="articles">
  783. <li class="chapter " data-level="10.2.1" data-path="../职业规划/给工作4年迷茫的程序员们的一点建议.html">
  784. <a href="../职业规划/给工作4年迷茫的程序员们的一点建议.html">
  785. 给工作 4 年迷茫的程序员们的一点建议
  786. </a>
  787. </li>
  788. <li class="chapter " data-level="10.2.2" data-path="../职业规划/聊聊技术人员的常见的职业问题.html">
  789. <a href="../职业规划/聊聊技术人员的常见的职业问题.html">
  790. 聊聊技术人员的常见的职业问题
  791. </a>
  792. </li>
  793. <li class="chapter " data-level="10.2.3" data-path="../职业规划/写给那些傻傻想做服务器开发的朋友.html">
  794. <a href="../职业规划/写给那些傻傻想做服务器开发的朋友.html">
  795. 写给那些傻傻想做服务器开发的朋友
  796. </a>
  797. </li>
  798. </ul>
  799. </li>
  800. <li class="chapter " data-level="10.3" data-path="../自我提升与开源代码/">
  801. <a href="../自我提升与开源代码/">
  802. 自我提升与开源代码
  803. </a>
  804. <ul class="articles">
  805. <li class="chapter " data-level="10.3.1" data-path="../自我提升与开源代码/2020年好好读一读开源代码吧.html">
  806. <a href="../自我提升与开源代码/2020年好好读一读开源代码吧.html">
  807. 2020 年好好读一读开源代码吧
  808. </a>
  809. </li>
  810. </ul>
  811. </li>
  812. <li class="chapter " data-level="10.4" data-path="../后端开发相关的书籍/">
  813. <a href="../后端开发相关的书籍/">
  814. 后端开发相关的书籍
  815. </a>
  816. <ul class="articles">
  817. <li class="chapter " data-level="10.4.1" data-path="../后端开发相关的书籍/后台开发应该读的书.html">
  818. <a href="../后端开发相关的书籍/后台开发应该读的书.html">
  819. 后台开发应该读的书
  820. </a>
  821. </li>
  822. </ul>
  823. </li>
  824. <li class="chapter " data-level="10.5" data-path="../程序员的简历/">
  825. <a href="../程序员的简历/">
  826. 程序员的简历
  827. </a>
  828. <ul class="articles">
  829. <li class="chapter " data-level="10.5.1" data-path="../程序员的简历/程序员如何写简历.html">
  830. <a href="../程序员的简历/程序员如何写简历.html">
  831. 程序员如何写简历
  832. </a>
  833. </li>
  834. </ul>
  835. </li>
  836. <li class="chapter " data-level="10.6" data-path="../程序员的薪资与年终奖那些事儿/">
  837. <a href="../程序员的薪资与年终奖那些事儿/">
  838. 程序员的薪资与年终奖那些事儿
  839. </a>
  840. <ul class="articles">
  841. <li class="chapter " data-level="10.6.1" data-path="../程序员的薪资与年终奖那些事儿/技术面试与HR谈薪资技巧.html">
  842. <a href="../程序员的薪资与年终奖那些事儿/技术面试与HR谈薪资技巧.html">
  843. 技术面试与HR谈薪资技巧
  844. </a>
  845. </li>
  846. <li class="chapter " data-level="10.6.2" data-path="../程序员的薪资与年终奖那些事儿/聊一聊程序员如何增加收入.html">
  847. <a href="../程序员的薪资与年终奖那些事儿/聊一聊程序员如何增加收入.html">
  848. 聊一聊程序员如何增加收入
  849. </a>
  850. </li>
  851. <li class="chapter " data-level="10.6.3" data-path="../程序员的薪资与年终奖那些事儿/谈一谈年终奖.html">
  852. <a href="../程序员的薪资与年终奖那些事儿/谈一谈年终奖.html">
  853. 谈一谈年终奖
  854. </a>
  855. </li>
  856. </ul>
  857. </li>
  858. <li class="chapter " data-level="10.7" data-path="../程序员的烦心事/">
  859. <a href="../程序员的烦心事/">
  860. 程序员的烦心事
  861. </a>
  862. <ul class="articles">
  863. <li class="chapter " data-level="10.7.1" data-path="../程序员的烦心事/拒绝了一家公司的offer后,他们的副总和hr总监同时打电话来询问拒绝原因并极力要求加入,我该不该去?.html">
  864. <a href="../程序员的烦心事/拒绝了一家公司的offer后,他们的副总和hr总监同时打电话来询问拒绝原因并极力要求加入,我该不该去?.html">
  865. 拒绝了一家公司的offer后,他们的副总和hr总监同时打电话来询问拒绝原因并极力要求加入,我该不该去?
  866. </a>
  867. </li>
  868. <li class="chapter " data-level="10.7.2" data-path="../程序员的烦心事/我是一名程序员,结婚时女友要求我用两年的工资作为彩礼,我该不该答应?.html">
  869. <a href="../程序员的烦心事/我是一名程序员,结婚时女友要求我用两年的工资作为彩礼,我该不该答应?.html">
  870. 我是一名程序员,结婚时女友要求我用两年的工资作为彩礼,我该不该答应?
  871. </a>
  872. </li>
  873. </ul>
  874. </li>
  875. <li class="chapter " data-level="10.8" data-path="../作者的故事/">
  876. <a href="../作者的故事/">
  877. 作者的故事
  878. </a>
  879. <ul class="articles">
  880. <li class="chapter " data-level="10.8.1" data-path="../作者的故事/我的2019.html">
  881. <a href="../作者的故事/我的2019.html">
  882. 我的 2019
  883. </a>
  884. </li>
  885. <li class="chapter " data-level="10.8.2" data-path="../作者的故事/我是如何年薪五十万的.html">
  886. <a href="../作者的故事/我是如何年薪五十万的.html">
  887. 我是如何年薪五十万的
  888. </a>
  889. </li>
  890. </ul>
  891. </li>
  892. <li class="divider"></li>
  893. <li>
  894. <a href="https://www.gitbook.com" target="blank" class="gitbook-link">
  895. Published with GitBook
  896. </a>
  897. </li>
  898. </ul>
  899. </nav>
  900. </div>
  901. <!-- Content nav -->
  902. <div class="book-anchor">
  903. <div class="book-anchor-title">在这篇文章中:</div>
  904. <div class="book-anchor-body">
  905. </div>
  906. </div>
  907. <div class="book-body">
  908. <div class="body-inner">
  909. <div class="book-header" role="navigation">
  910. <!-- Title -->
  911. <h1>
  912. <i class="fa fa-circle-o-notch fa-spin"></i>
  913. <a href="../.." >02 网络监听的建立</a>
  914. </h1>
  915. </div>
  916. <div class="page-wrapper" tabindex="-1" role="main">
  917. <div class="page-inner">
  918. <div id="book-search-results">
  919. <div class="search-noresults">
  920. <section class="normal markdown-section">
  921. <div id="anchor-navigation-ex-navbar"><i class="fa fa-navicon"></i><ul><li><span class="title-icon "></span><a href="#memcached&#x6E90;&#x7801;&#x9605;&#x8BFB;&#x4E8C;-&#x7F51;&#x7EDC;&#x76D1;&#x542C;&#x7684;&#x5EFA;&#x7ACB;"><b></b>Memcached&#x6E90;&#x7801;&#x9605;&#x8BFB;&#x4E8C; &#x7F51;&#x7EDC;&#x76D1;&#x542C;&#x7684;&#x5EFA;&#x7ACB;</a></li></ul></div><h1 id="memcached&#x6E90;&#x7801;&#x9605;&#x8BFB;&#x4E8C;-&#x7F51;&#x7EDC;&#x76D1;&#x542C;&#x7684;&#x5EFA;&#x7ACB;"><a name="memcached&#x6E90;&#x7801;&#x9605;&#x8BFB;&#x4E8C;-&#x7F51;&#x7EDC;&#x76D1;&#x542C;&#x7684;&#x5EFA;&#x7ACB;" class="anchor-navigation-ex-anchor" href="#memcached&#x6E90;&#x7801;&#x9605;&#x8BFB;&#x4E8C;-&#x7F51;&#x7EDC;&#x76D1;&#x542C;&#x7684;&#x5EFA;&#x7ACB;"><i class="fa fa-link" aria-hidden="true"></i></a>Memcached&#x6E90;&#x7801;&#x9605;&#x8BFB;&#x4E8C; &#x7F51;&#x7EDC;&#x76D1;&#x542C;&#x7684;&#x5EFA;&#x7ACB;</h1>
  922. <p><code>Memcahced</code>&#x662F;&#x4E00;&#x4E2A;&#x670D;&#x52A1;&#x5668;&#x7A0B;&#x5E8F;&#xFF0C;&#x6240;&#x4EE5;&#x9700;&#x8981;&#x5EFA;&#x7ACB;&#x7F51;&#x7EDC;&#x76D1;&#x542C;&#x6765;&#x63A5;&#x53D7;&#x5176;&#x4ED6;&#x5BA2;&#x6237;&#x7AEF;&#x673A;&#x5668;&#x7684;&#x8FDE;&#x63A5;&#xFF0C;&#x4E0B;&#x9762;&#x5206;&#x6790;&#x4E0B;&#x5176;&#x8FC7;&#x7A0B;&#xFF0C;&#x8FD9;&#x6B21;&#x5206;&#x6790;&#x662F;&#x57FA;&#x4E8E;<code>Memcached 1.4.15</code>&#x7248;&#x672C;&#x5206;&#x6790;&#x7684;&#x3002;</p>
  923. <pre class="language-"><code>// &#x5982;&#x679C;socketpath&#x4E3A;&#x7A7A;&#xFF0C;&#x5219;&#x8868;&#x793A;&#x4F7F;&#x7528;&#x7684;TCP / UDP, &#x4E0D;&#x662F;&#x4F7F;&#x7528;unix socket
  924. //&#x5982;&#x679C;socketpath&#x4E3A;&#x7A7A;&#xFF0C;&#x5219;&#x8868;&#x793A;&#x4F7F;&#x7528;&#x7684;TCP/UDP,&#x4E0D;&#x662F;&#x4F7F;&#x7528;unix socket
  925. if (settings.socketpath == NULL)
  926. {
  927. //&#x53EF;&#x4EE5;&#x4ECE;&#x73AF;&#x5883;&#x53D8;&#x91CF;&#x8BFB;&#x53D6;&#x7AEF;&#x53E3;&#x6587;&#x4EF6;&#x6240;&#x5728;&#x7684;&#x6587;&#x4EF6;&#x8DEF;&#x5F84;
  928. const char *portnumber_filename = getenv(&quot;MEMCACHED_PORT_FILENAME&quot;);
  929. char temp_portnumber_filename[PATH_MAX];
  930. FILE *portnumber_file = NULL;
  931. //&#x5982;&#x679C;&#x7AEF;&#x53E3;&#x6587;&#x4EF6;&#x4E0D;&#x4E3A;&#x7A7A;&#xFF0C;&#x5219;&#x6253;&#x5F00;
  932. if (portnumber_filename != NULL)
  933. {
  934. snprintf(temp_portnumber_filename, sizeof(temp_portnumber_filename),
  935. &quot;%s.lck&quot;, portnumber_filename);
  936. portnumber_file = fopen(temp_portnumber_filename, &quot;a&quot;);
  937. if (portnumber_file == NULL)
  938. {
  939. fprintf(stderr, &quot;Failed to open \&quot;%s\&quot;: %s\n&quot;,
  940. temp_portnumber_filename, strerror(errno));
  941. }
  942. }
  943. //settings.port&#x8868;&#x793A;Memcached&#x91C7;&#x7528;&#x7684;&#x662F;TCP&#x534F;&#x8BAE;&#xFF0C;&#x521B;&#x5EFA;TCP Socket&#xFF0C;&#x76D1;&#x542C;&#x5E76;&#x4E14;&#x7ED1;&#x5B9A;
  944. errno = 0;
  945. if (settings.port
  946. &amp;&amp; server_sockets(settings.port, tcp_transport, portnumber_file))
  947. {
  948. vperror(&quot;failed to listen on TCP port %d&quot;, settings.port);
  949. exit(EX_OSERR);
  950. }
  951. //settings.udpport&#x8868;&#x793A;Memcached&#x91C7;&#x7528;&#x7684;&#x662F;UDP&#x534F;&#x8BAE;&#xFF0C;&#x521B;&#x5EFA;UDP Socket&#xFF0C;&#x76D1;&#x542C;&#x5E76;&#x4E14;&#x7ED1;&#x5B9A;
  952. errno = 0;
  953. if (settings.udpport
  954. &amp;&amp; server_sockets(settings.udpport, udp_transport, portnumber_file))
  955. {
  956. vperror(&quot;failed to listen on UDP port %d&quot;, settings.udpport);
  957. exit(EX_OSERR);
  958. }
  959. //&#x7AEF;&#x53E3;&#x6587;&#x4EF6;&#x4E0D;&#x4E3A;&#x7A7A;
  960. if (portnumber_file)
  961. {
  962. fclose(portnumber_file);//&#x5173;&#x95ED;&#x6587;&#x4EF6;
  963. rename(temp_portnumber_filename, portnumber_filename);//&#x91CD;&#x547D;&#x540D;&#x7AEF;&#x53E3;&#x6587;&#x4EF6;
  964. }
  965. }
  966. //TCP&#x548C;UDP&#x4F7F;&#x7528;&#x7684;&#x662F;&#x540C;&#x4E00;&#x4E2A;&#x63A5;&#x53E3;&#x6765;&#x521B;&#x5EFA;&#x76D1;&#x542C;&#x548C;&#x7ED1;&#x5B9A;
  967. static int server_sockets(int port, enum network_transport transport,
  968. FILE *portnumber_file)
  969. {
  970. //settings.inter&#x6307;&#x5B9A;&#x7684;&#x662F;&#x8981;&#x7ED1;&#x5B9A;&#x7684;ip&#x5730;&#x5740;&#x4FE1;&#x606F;&#xFF0C;&#x5982;&#x679C;&#x4E3A;&#x7A7A;&#xFF0C;&#x5219;&#x8868;&#x793A;&#x662F;&#x7ED1;&#x5B9A;&#x672C;&#x673A;&#x4E00;&#x4E2A;ip
  971. if (settings.inter == NULL)
  972. {
  973. //&#x6267;&#x884C;&#x76D1;&#x542C;&#x548C;&#x7ED1;&#x5B9A;&#x64CD;&#x4F5C;
  974. return server_socket(settings.inter, port, transport, portnumber_file);
  975. }
  976. //&#x5982;&#x679C;&#x670D;&#x52A1;&#x5668;&#x6709;&#x591A;&#x4E2A;ip&#x4FE1;&#x606F;&#xFF0C;&#x53EF;&#x4EE5;&#x5728;&#x6BCF;&#x4E2A;(ip,port)&#x4E0A;&#x9762;&#x7ED1;&#x5B9A;&#x4E00;&#x4E2A;Memcached&#x5B9E;&#x4F8B;&#xFF0C;&#x4E0B;&#x9762;&#x662F;&#x4E00;&#x4E9B;&#x8F93;&#x5165;&#x53C2;&#x6570;&#x7684;&#x89E3;&#x6790;&#xFF0C;&#x89E3;&#x6790;&#x5B8C;&#x6BD5;&#x4E4B;&#x540E;&#xFF0C;&#x6267;&#x884C;&#x7ED1;&#x5B9A;
  977. else
  978. {
  979. // tokenize them and bind to each one of them..
  980. char *b;
  981. int ret = 0;
  982. char *list = strdup(settings.inter);
  983. if (list == NULL)
  984. {
  985. fprintf(stderr,
  986. &quot;Failed to allocate memory for parsing server interface string\n&quot;);
  987. return 1;
  988. }
  989. for (char *p = strtok_r(list, &quot;;,&quot;, &amp;b); p != NULL;
  990. p = strtok_r(NULL, &quot;;,&quot;, &amp;b))
  991. {
  992. int the_port = port;
  993. char *s = strchr(p, &apos;:&apos;);
  994. if (s != NULL)
  995. {
  996. *s = &apos;\0&apos;;
  997. ++s;
  998. if (!safe_strtol(s, &amp;the_port))
  999. {
  1000. fprintf(stderr, &quot;Invalid port number: \&quot;%s\&quot;&quot;, s);
  1001. return 1;
  1002. }
  1003. }
  1004. if (strcmp(p, &quot;*&quot;) == 0)
  1005. {
  1006. p = NULL;
  1007. }
  1008. //&#x7ED1;&#x5B9A;&#x591A;&#x6B21;,&#x5FAA;&#x73AF;&#x8C03;&#x7528;&#x5355;&#x4E2A;&#x7684;&#x7ED1;&#x5B9A;&#x51FD;&#x6570;
  1009. ret |= server_socket(p, the_port, transport, portnumber_file);
  1010. }
  1011. free(list);
  1012. return ret;
  1013. }
  1014. }
  1015. //&#x6267;&#x884C;&#x771F;&#x6B63;&#x7684;&#x7ED1;&#x5B9A;
  1016. static int server_socket(const char *interface, int port,
  1017. enum network_transport transport, FILE *portnumber_file)
  1018. {
  1019. int sfd;
  1020. struct linger ling = { 0, 0 };
  1021. struct addrinfo *ai;
  1022. struct addrinfo *next;
  1023. //&#x8BBE;&#x5B9A;&#x534F;&#x8BAE;&#x65E0;&#x5173;&#xFF0C;&#x7528;&#x4E8E;&#x76D1;&#x542C;&#x7684;&#x6807;&#x5FD7;&#x4F4D;
  1024. struct addrinfo hints = { .ai_flags = AI_PASSIVE,.ai_family = AF_UNSPEC };
  1025. char port_buf[NI_MAXSERV];
  1026. int error;
  1027. int success = 0;
  1028. int flags = 1;
  1029. //&#x6307;&#x5B9A;socket&#x7684;&#x7C7B;&#x578B;&#xFF0C;&#x5982;&#x679C;&#x662F;udp&#xFF0C;&#x5219;&#x7528;&#x6570;&#x636E;&#x62A5;&#x534F;&#x8BAE;&#xFF0C;&#x5982;&#x679C;&#x662F;tcp,&#x5219;&#x7528;&#x6570;&#x636E;&#x6D41;&#x534F;&#x8BAE;
  1030. hints.ai_socktype = IS_UDP(transport) ? SOCK_DGRAM : SOCK_STREAM;
  1031. if (port == -1)
  1032. {
  1033. port = 0;
  1034. }
  1035. snprintf(port_buf, sizeof(port_buf), &quot;%d&quot;, port);
  1036. //&#x8C03;&#x7528;getaddrinfo,&#x5C06;&#x4E3B;&#x673A;&#x5730;&#x5740;&#x548C;&#x7AEF;&#x53E3;&#x53F7;&#x6620;&#x5C04;&#x6210;&#x4E3A;socket&#x5730;&#x5740;&#x4FE1;&#x606F;&#xFF0C;&#x5730;&#x5740;&#x4FE1;&#x606F;&#x7531;ai&#x5E26;&#x56DE;
  1037. error = getaddrinfo(interface, port_buf, &amp;hints, &amp;ai);
  1038. if (error != 0)
  1039. {
  1040. if (error != EAI_SYSTEM)
  1041. fprintf(stderr, &quot;getaddrinfo(): %s\n&quot;, gai_strerror(error));
  1042. else
  1043. perror(&quot;getaddrinfo()&quot;);
  1044. return 1;
  1045. }
  1046. /*getaddrinfo&#x8FD4;&#x56DE;&#x591A;&#x4E2A;addrinfo&#x7684;&#x60C5;&#x5F62;&#x6709;&#x5982;&#x4E0B;&#x4E24;&#x79CD;&#xFF1A;
  1047. 1.&#x5982;&#x679C;&#x4E0E;interface&#x53C2;&#x6570;&#x5173;&#x8054;&#x7684;&#x5730;&#x5740;&#x6709;&#x591A;&#x4E2A;&#xFF0C;&#x90A3;&#x4E48;&#x9002;&#x7528;&#x4E8E;&#x6240;&#x8BF7;&#x6C42;&#x5730;&#x5740;&#x7C07;&#x7684;&#x6BCF;&#x4E2A;&#x5730;&#x5740;&#x90FD;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x5BF9;&#x5E94;&#x7684;&#x7ED3;&#x6784;&#x3002;
  1048. 2.&#x5982;&#x679C;port_buf&#x53C2;&#x6570;&#x6307;&#x5B9A;&#x7684;&#x670D;&#x52A1;&#x652F;&#x6301;&#x591A;&#x4E2A;&#x5957;&#x63A5;&#x53E3;&#x7C7B;&#x578B;&#xFF0C;&#x90A3;&#x4E48;&#x6BCF;&#x4E2A;&#x5957;&#x63A5;&#x53E3;&#x7C7B;&#x578B;&#x90FD;&#x53EF;&#x80FD;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x5BF9;&#x5E94;&#x7684;&#x7ED3;&#x6784;&#x3002;
  1049. */
  1050. for (next = ai; next; next = next-&gt;ai_next)
  1051. {
  1052. conn *listen_conn_add;
  1053. //&#x4E3A;&#x6BCF;&#x4E2A;&#x5730;&#x5740;&#x4FE1;&#x606F;&#x5EFA;&#x7ACB;socket
  1054. if ((sfd = new_socket(next)) == -1)
  1055. {
  1056. //&#x5EFA;&#x7ACB;socket&#x8FC7;&#x7A0B;&#x4E2D;&#x53EF;&#x80FD;&#x53D1;&#x751F;&#x7684;&#xFF0C;&#x6BD4;&#x5982;&#x6253;&#x5F00;&#x6587;&#x4EF6;&#x63CF;&#x8FF0;&#x7B26;&#x8FC7;&#x591A;&#x7B49;
  1057. if (errno == EMFILE)
  1058. {
  1059. perror(&quot;server_socket&quot;);
  1060. exit(EX_OSERR);
  1061. }
  1062. continue;
  1063. }
  1064. #ifdef IPV6_V6ONLY
  1065. if (next-&gt;ai_family == AF_INET6)
  1066. {
  1067. //&#x8BBE;&#x5B9A;IPV6&#x7684;&#x9009;&#x9879;&#x503C;&#xFF0C;&#x8BBE;&#x7F6E;&#x4E86;IPV6_V6ONLY&#xFF0C;&#x8868;&#x793A;&#x53EA;&#x6536;&#x53D1;IPV6&#x7684;&#x6570;&#x636E;&#x5305;&#xFF0C;&#x6B64;&#x65F6;IPV4&#x548C;IPV6&#x53EF;&#x4EE5;&#x7ED1;&#x5B9A;&#x5230;&#x540C;&#x4E00;&#x4E2A;&#x7AEF;&#x53E3;&#x800C;&#x4E0D;&#x5F71;&#x54CD;&#x6570;&#x636E;&#x7684;&#x6536;&#x53D1;
  1068. error = setsockopt(sfd, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&amp;flags,
  1069. sizeof(flags));
  1070. if (error != 0)
  1071. {
  1072. perror(&quot;setsockopt&quot;);
  1073. close(sfd);
  1074. continue;
  1075. }
  1076. }
  1077. #endif
  1078. //&#x8BBE;&#x5B9A;socket&#x9009;&#x9879;&#xFF0C;SO_REUSEADDR&#x8868;&#x793A;&#x91CD;&#x7528;&#x5730;&#x5740;&#x4FE1;&#x606F;&#xFF0C;&#x5177;&#x4F53;&#x91CD;&#x7528;&#x54EA;&#x4E9B;&#x4E1C;&#x897F;&#x81EA;&#x884C;&#x5B66;&#x4E60;&#xFF0C;&#x5FC5;&#x987B;&#x5728;bind&#x64CD;&#x4F5C;&#x4E4B;&#x524D;&#x8BBE;&#x7F6E;
  1079. setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, (void *)&amp;flags, sizeof(flags));
  1080. if (IS_UDP(transport)){
  1081. maximize_sndbuf(sfd);//&#x6269;&#x5927;&#x53D1;&#x9001;&#x7F13;&#x51B2;&#x533A;
  1082. }
  1083. else
  1084. {
  1085. //&#x8BBE;&#x5B9A;socket&#x9009;&#x9879;&#xFF0C;SO_KEEPALIVE&#x8868;&#x793A;&#x4FDD;&#x6D3B;
  1086. error = setsockopt(sfd, SOL_SOCKET, SO_KEEPALIVE, (void *)&amp;flags,
  1087. sizeof(flags));
  1088. if (error != 0)
  1089. perror(&quot;setsockopt&quot;);
  1090. //&#x8BBE;&#x5B9A;socket&#x9009;&#x9879;&#xFF0C;SO_LINGER&#x8868;&#x793A;&#x6267;&#x884C;close&#x64CD;&#x4F5C;&#x65F6;&#xFF0C;&#x5982;&#x679C;&#x7F13;&#x51B2;&#x533A;&#x8FD8;&#x6709;&#x6570;&#x636E;&#xFF0C;&#x53EF;&#x4EE5;&#x7EE7;&#x7EED;&#x53D1;&#x9001;
  1091. error = setsockopt(sfd, SOL_SOCKET, SO_LINGER, (void *)&amp;ling,
  1092. sizeof(ling));
  1093. if (error != 0)
  1094. perror(&quot;setsockopt&quot;);
  1095. //&#x8BBE;&#x5B9A;IP&#x9009;&#x9879;&#xFF0C;TCP_NODELAY&#x8868;&#x793A;&#x7981;&#x7528;Nagle&#x7B97;&#x6CD5;
  1096. error = setsockopt(sfd, IPPROTO_TCP, TCP_NODELAY, (void *)&amp;flags,
  1097. sizeof(flags));
  1098. if (error != 0)
  1099. perror(&quot;setsockopt&quot;);
  1100. }
  1101. if (bind(sfd, next-&gt;ai_addr, next-&gt;ai_addrlen) == -1)
  1102. {
  1103. if (errno != EADDRINUSE)
  1104. {
  1105. perror(&quot;bind()&quot;);
  1106. close(sfd);
  1107. freeaddrinfo(ai);
  1108. return 1;
  1109. }
  1110. close(sfd);
  1111. continue;
  1112. }
  1113. else
  1114. {
  1115. success++;
  1116. //&#x5982;&#x679C;&#x4E0D;&#x662F;UDP&#x534F;&#x8BAE;&#xFF0C;&#x5219;&#x6267;&#x884C;&#x76D1;&#x542C;&#x64CD;&#x4F5C;&#xFF0C;&#x76D1;&#x542C;&#x961F;&#x5217;&#x4E3A;&#x521D;&#x59CB;&#x542F;&#x52A8;&#x7684;&#x503C;
  1117. if (!IS_UDP(transport) &amp;&amp; listen(sfd, settings.backlog) == -1)
  1118. {
  1119. perror(&quot;listen()&quot;);
  1120. close(sfd);
  1121. freeaddrinfo(ai);
  1122. return 1;
  1123. }
  1124. if (portnumber_file != NULL
  1125. &amp;&amp; (next-&gt;ai_addr-&gt;sa_family == AF_INET
  1126. || next-&gt;ai_addr-&gt;sa_family == AF_INET6))
  1127. {
  1128. union
  1129. {
  1130. struct sockaddr_in in;
  1131. struct sockaddr_in6 in6;
  1132. } my_sockaddr;
  1133. socklen_t len = sizeof(my_sockaddr);
  1134. //&#x8FD9;&#x65F6;&#x8FD8;&#x6CA1;&#x8FDE;&#x63A5;&#x5EFA;&#x7ACB;&#xFF0C;&#x8C03;&#x7528;getsockname&#x4E0D;&#x77E5;&#x9053;&#x6709;&#x4EC0;&#x4E48;&#x7528;&#xFF1F; if (getsockname(sfd, (struct sockaddr*) &amp;my_sockaddr, &amp;len) == 0) {
  1135. if (next-&gt;ai_addr-&gt;sa_family == AF_INET)
  1136. {
  1137. fprintf(portnumber_file, &quot;%s INET: %u\n&quot;,
  1138. IS_UDP(transport) ? &quot;UDP&quot; : &quot;TCP&quot;,
  1139. ntohs(my_sockaddr.in.sin_port));
  1140. }
  1141. else
  1142. {
  1143. fprintf(portnumber_file, &quot;%s INET6: %u\n&quot;,
  1144. IS_UDP(transport) ? &quot;UDP&quot; : &quot;TCP&quot;,
  1145. ntohs(my_sockaddr.in6.sin6_port));
  1146. }
  1147. }
  1148. }
  1149. }
  1150. if (IS_UDP(transport))
  1151. {
  1152. int c;
  1153. for (c = 0; c &lt; settings.num_threads_per_udp; c++)
  1154. {
  1155. //&#x5206;&#x53D1;&#x8FDE;&#x63A5;&#xFF0C;&#x56E0;&#x4E3A;UDP&#x6CA1;&#x6709;&#x8FDE;&#x63A5;&#x5EFA;&#x7ACB;&#x7684;&#x8FC7;&#x7A0B;&#xFF0C;&#x76F4;&#x63A5;&#x8FDB;&#x884C;&#x8FDE;&#x63A5;&#x7684;&#x5206;&#x53D1;
  1156. dispatch_conn_new(sfd, conn_read, EV_READ | EV_PERSIST, UDP_READ_BUFFER_SIZE, transport);
  1157. }
  1158. }
  1159. else
  1160. {
  1161. //TCP,&#x5EFA;&#x7ACB;&#x8FDE;&#x63A5;
  1162. if (!(listen_conn_add = conn_new(sfd, conn_listening, EV_READ |
  1163. EV_PERSIST, 1, transport, main_base)))
  1164. {
  1165. fprintf(stderr, &quot;failed to create listening connection\n&quot;);
  1166. exit(EXIT_FAILURE);
  1167. }
  1168. //&#x5EFA;&#x7ACB;&#x7684;&#x8FDE;&#x63A5;&#x7EC4;&#x6210;&#x94FE;&#x8868;
  1169. listen_conn_add-&gt;next = listen_conn;
  1170. listen_conn = listen_conn_add;
  1171. //&#x91CA;&#x653E;&#x8D44;&#x6E90;
  1172. freeaddrinfo(ai);
  1173. return success == 0;
  1174. }
  1175. //&#x5EFA;&#x7ACB;socket
  1176. static int new_socket(struct addrinfo *ai)
  1177. {
  1178. int sfd;
  1179. int flags;
  1180. //&#x8C03;&#x7528;&#x7CFB;&#x7EDF;&#x51FD;&#x6570;&#x5EFA;&#x7ACB;socket
  1181. if ((sfd = socket(ai-&gt;ai_family, ai-&gt;ai_socktype, ai-&gt;ai_protocol)) == -1)
  1182. {
  1183. return -1;
  1184. }
  1185. //&#x8BBE;&#x5B9A;socket&#x4E3A;&#x975E;&#x963B;&#x585E;&#x7684;
  1186. if ((flags = fcntl(sfd, F_GETFL, 0)) &lt; 0
  1187. || fcntl(sfd, F_SETFL, flags | O_NONBLOCK) &lt; 0)
  1188. {
  1189. perror(&quot;setting O_NONBLOCK&quot;);
  1190. close(sfd);
  1191. return -1;
  1192. }
  1193. return sfd;
  1194. }
  1195. //&#x5982;&#x679C;&#x662F;UDP&#x534F;&#x8BAE;&#xFF0C;&#x8C03;&#x6574;&#x53D1;&#x9001;&#x7F13;&#x5B58;&#x5230;&#x6700;&#x5927;&#x503C;
  1196. static void maximize_sndbuf(const int sfd)
  1197. {
  1198. socklen_t intsize = sizeof(int);
  1199. int last_good = 0;
  1200. int min, max, avg;
  1201. int old_size;
  1202. //&#x8BFB;&#x53D6;socket&#x7684;&#x9009;&#x9879;&#xFF0C;SO_SNDBF&#x8868;&#x793A;&#x53D1;&#x9001;&#x7F13;&#x5B58;
  1203. if (getsockopt(sfd, SOL_SOCKET, SO_SNDBUF, &amp;old_size, &amp;intsize) != 0)
  1204. {
  1205. if (settings.verbose &gt; 0)
  1206. perror(&quot;getsockopt(SO_SNDBUF)&quot;);
  1207. return;
  1208. }
  1209. //&#x4E8C;&#x5206;&#x641C;&#x7D22;&#x6765;&#x8BBE;&#x5B9A;&#xFF0C;&#x5F88;&#x5DE7;&#x7684;&#x8BBE;&#x8BA1;
  1210. min = old_size;
  1211. max = MAX_SENDBUF_SIZE;
  1212. while (min &lt;= max)
  1213. {
  1214. avg = ((unsigned int)(min + max)) / 2;
  1215. if (setsockopt(sfd, SOL_SOCKET, SO_SNDBUF, (void *)&amp;avg, intsize) == 0)
  1216. {
  1217. last_good = avg;
  1218. min = avg + 1;
  1219. }
  1220. else
  1221. {
  1222. max = avg - 1;
  1223. }
  1224. }
  1225. if (settings.verbose &gt; 1)
  1226. fprintf(stderr, &quot;&lt;%d send buffer was %d, now %d\n&quot;, sfd, old_size,
  1227. last_good);
  1228. }
  1229. </code></pre><p>&#x81F3;&#x6B64;&#xFF0C;&#x7F51;&#x7EDC;&#x76F8;&#x5173;&#x7684;&#x90E8;&#x5206;&#x5DF2;&#x7ECF;&#x5B8C;&#x6210;&#xFF0C;&#x540E;&#x5411;&#x8FDE;&#x63A5;&#x7684;&#x5EFA;&#x7ACB;&#xFF08;<code>conn_new</code>&#xFF09;&#x548C;&#x8FDE;&#x63A5;&#x5206;&#x53D1;&#xFF08;<code>dispatch_conn_new</code>&#xFF09;&#xFF0C;&#x6211;&#x4EEC;&#x653E;&#x5230;&#x5176;&#x4ED6;&#x6587;&#x7AE0;&#x4E2D;&#x8FDB;&#x884C;&#x5206;&#x6790;&#x3002;</p>
  1230. <footer class="page-footer"><span class="copyright">&#x5982;&#x9700;&#x4E0B;&#x8F7D;&#x672C;&#x7AD9;&#x5168;&#x90E8;&#x6280;&#x672F;&#x6587;&#x7AE0;&#xFF0C;&#x53EF;&#x4EE5;&#x5728;&#x3010;&#x9AD8;&#x6027;&#x80FD;&#x670D;&#x52A1;&#x5668;&#x5F00;&#x53D1;&#x3011;&#x516C;&#x4F17;&#x53F7;&#x56DE;&#x590D;&#x5173;&#x952E;&#x5B57;&#x201C;&#x6587;&#x7AE0;&#x4E0B;&#x8F7D;&#x201D;&#x5373;&#x53EF;&#x3002;</span><span class="footer-modification">&#x6700;&#x8FD1;&#x66F4;&#x65B0;&#x65F6;&#x95F4;&#xFF1A;
  1231. 2020-10-03 14:06:36
  1232. </span></footer>
  1233. <script>console.log("plugin-popup....");document.onclick = function(e){ e.target.tagName === "IMG" && window.open(e.target.src,e.target.src)}</script><style>img{cursor:pointer}</style>
  1234. </section>
  1235. </div>
  1236. <div class="search-results">
  1237. <div class="has-results">
  1238. <h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1>
  1239. <ul class="search-results-list"></ul>
  1240. </div>
  1241. <div class="no-results">
  1242. <h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
  1243. </div>
  1244. </div>
  1245. </div>
  1246. </div>
  1247. </div>
  1248. </div>
  1249. <a href="01初始化参数解析.html" class="navigation navigation-prev " aria-label="Previous page: 01 初始化参数解析">
  1250. <i class="fa fa-angle-left"></i>
  1251. </a>
  1252. <a href="03网络连接建立.html" class="navigation navigation-next " aria-label="Next page: 03 网络连接建立">
  1253. <i class="fa fa-angle-right"></i>
  1254. </a>
  1255. </div>
  1256. <script>
  1257. var gitbook = gitbook || [];
  1258. gitbook.push(function() {
  1259. gitbook.page.hasChanged({"page":{"title":"02 网络监听的建立","level":"8.1.3","depth":2,"next":{"title":"03 网络连接建立","level":"8.1.4","depth":2,"path":"articles/Memcached源码分析/03网络连接建立.md","ref":"articles/Memcached源码分析/03网络连接建立.md","articles":[]},"previous":{"title":"01 初始化参数解析","level":"8.1.2","depth":2,"path":"articles/Memcached源码分析/01初始化参数解析.md","ref":"articles/Memcached源码分析/01初始化参数解析.md","articles":[]},"dir":"ltr"},"config":{"plugins":["chapter-fold","-lunr","-search","search-pro","splitter","popup","back-to-top-button","hide-element","prism","-highlight","tbfed-pagefooter","code","anchor-navigation-ex","theme-fexa","livereload"],"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"pluginsConfig":{"tbfed-pagefooter":{"copyright":"如需下载本站全部技术文章,可以在【高性能服务器开发】公众号回复关键字“文章下载”即可。","modify_label":"最近更新时间:","modify_format":"YYYY-MM-DD HH:mm:ss"},"chapter-fold":{},"prism":{},"livereload":{},"splitter":{},"search-pro":{},"popup":{},"theme-fexa":{"search-placeholder":"输入关键字搜索","logo":"./logo.png","favicon":"./favicon.ico"},"code":{"copyButtons":true},"hide-element":{"elements":[".gitbook-link"]},"fontsettings":{"theme":"white","family":"sans","size":2},"anchor-navigation-ex":{"showLevel":false,"associatedWithSummary":true,"mode":"float","showGoTop":false,"printLog":false,"multipleH1":true,"float":{"floatIcon":"fa fa-navicon","showLevelIcon":false,"level1Icon":"","level2Icon":"","level3Icon":""},"pageTop":{"showLevelIcon":false,"level1Icon":"","level2Icon":"","level3Icon":""}},"back-to-top-button":{},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false}},"theme":"default","author":"easy_coder","pdf":{"pageBreaksBefore":"/","headerTemplate":null,"paperSize":"a4","margin":{"right":62,"left":62,"top":36,"bottom":36},"fontSize":12,"fontFamily":"Arial","footerTemplate":null,"chapterMark":"pagebreak","pageNumbers":false},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"isbn":"","variables":{},"title":"高性能服务器开发 技术专栏","links":{},"gitbook":"*","description":"","theme-default":{"showLevel":true},"extension":null},"file":{"path":"articles/Memcached源码分析/02网络监听的建立.md","mtime":"2020-10-03T06:06:36.959Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2020-10-09T15:31:57.905Z"},"basePath":"../..","book":{"language":""}});
  1260. });
  1261. </script>
  1262. </div>
  1263. <script src="../../gitbook/gitbook.js"></script>
  1264. <script src="../../gitbook/theme.js"></script>
  1265. <script src="../../gitbook/gitbook-plugin-chapter-fold/chapter-fold.js"></script>
  1266. <script src="../../gitbook/gitbook-plugin-search-pro/jquery.mark.min.js"></script>
  1267. <script src="../../gitbook/gitbook-plugin-search-pro/search.js"></script>
  1268. <script src="../../gitbook/gitbook-plugin-splitter/splitter.js"></script>
  1269. <script src="../../gitbook/gitbook-plugin-back-to-top-button/plugin.js"></script>
  1270. <script src="../../gitbook/gitbook-plugin-hide-element/plugin.js"></script>
  1271. <script src="../../gitbook/gitbook-plugin-code/plugin.js"></script>
  1272. <script src="../../gitbook/gitbook-plugin-livereload/plugin.js"></script>
  1273. <script src="../../gitbook/gitbook-plugin-sharing/buttons.js"></script>
  1274. <script src="../../gitbook/gitbook-plugin-fontsettings/fontsettings.js"></script>
  1275. <script src="../../gitbook/gitbook-plugin-theme-fexa/fexa.js"></script>
  1276. </body>
  1277. </html>