<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
<meta name="generator" content="pdf2htmlEX">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<link rel="stylesheet" href="https://static.pudn.com/base/css/base.min.css">
<link rel="stylesheet" href="https://static.pudn.com/base/css/fancy.min.css">
<link rel="stylesheet" href="https://static.pudn.com/prod/directory_preview_static/622b326e81ded46b7f2f204d/raw.css">
<script src="https://static.pudn.com/base/js/compatibility.min.js"></script>
<script src="https://static.pudn.com/base/js/pdf2htmlEX.min.js"></script>
<script>
try{
pdf2htmlEX.defaultViewer = new pdf2htmlEX.Viewer({});
}catch(e){}
</script>
<title></title>
</head>
<body>
<div id="sidebar" style="display: none">
<div id="outline">
</div>
</div>
<div id="pf1" class="pf w0 h0" data-page-no="1"><div class="pc pc1 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/622b326e81ded46b7f2f204d/bg1.jpg"><div class="c x0 y1 w2 h2"><div class="t m0 x1 h3 y2 ff1 fs0 fc0 sc0 ls0 ws0">使用<span class="_ _0"> </span><span class="ff2 sc1">VC++</span>的网络编程总结</div><div class="t m0 x2 h4 y3 ff3 fs1 fc1 sc1 ls0 ws0">1<span class="ff1">.套接字编程原理</span></div><div class="t m0 x3 h4 y4 ff3 fs1 fc1 sc1 ls0 ws0">1.1 Client/server<span class="_ _1"> </span><span class="ff1">通信模型</span></div><div class="t m0 x3 h4 y5 ff3 fs1 fc1 sc1 ls0 ws0">1.2 W<span class="_ _2"></span>indows Sockets<span class="_ _1"> </span><span class="ff1">规范</span></div><div class="t m0 x3 h4 y6 ff3 fs1 fc1 sc1 ls0 ws0">1.3 <span class="ff1">套接字</span></div><div class="t m0 x4 h4 y7 ff3 fs1 fc1 sc1 ls0 ws0">1.3.1 <span class="ff1">套接字定义</span></div><div class="t m0 x4 h4 y8 ff3 fs1 fc1 sc1 ls0 ws0">1.3.2<span class="_ _1"> </span><span class="ff1">分类</span></div><div class="t m0 x4 h4 y9 ff3 fs1 fc1 sc1 ls0 ws0">1.3.3 <span class="ff1">套接字的作用</span></div><div class="t m0 x4 h4 ya ff3 fs1 fc1 sc1 ls0 ws0">1.3.4<span class="_ _1"> </span><span class="ff1">端口与地址</span></div><div class="t m0 x4 h4 yb ff3 fs1 fc1 sc1 ls0 ws0">1.3.5 <span class="ff1">套接口属性</span></div><div class="t m0 x2 h4 yc ff3 fs1 fc1 sc1 ls0 ws0">2<span class="ff1">.基本的<span class="_ _1"> </span></span>W<span class="_ _2"></span>indows Sockets <span class="_ _2"></span>API<span class="_ _1"> </span><span class="ff1">编程</span></div><div class="t m0 x3 h4 yd ff3 fs1 fc1 sc1 ls0 ws0">2.1<span class="_ _1"> </span><span class="ff1">常用函数</span></div><div class="t m0 x3 h4 ye ff3 fs1 fc1 sc1 ls0 ws0">2.2 TCP<span class="_ _3"> </span><span class="ff1">实例</span></div><div class="t m0 x3 h4 yf ff3 fs1 fc1 sc1 ls0 ws0">2.3 UDP<span class="_ _3"> </span><span class="ff1">实例</span></div><div class="t m0 x3 h4 y10 ff3 fs1 fc1 sc1 ls0 ws0">2.4 Socket <span class="ff1">通信阻塞的解决方法</span></div><div class="t m0 x2 h4 y11 ff3 fs1 fc1 sc1 ls0 ws0">3<span class="ff1">.</span>MFC<span class="_ _1"> </span><span class="ff1">下的<span class="_ _3"> </span></span>Socket<span class="_ _1"> </span><span class="ff1">编程的类</span></div><div class="t m0 x3 h4 y12 ff3 fs1 fc1 sc1 ls0 ws0">3.1 CAsyncSocket<span class="_ _1"> </span><span class="ff1">类</span></div><div class="t m0 x3 h4 y13 ff3 fs1 fc1 sc1 ls0 ws0">3.2 CSocket<span class="_ _1"> </span><span class="ff1">类</span></div><div class="t m0 x3 h4 y14 ff3 fs1 fc1 sc1 ls0 ws0">3.3 W<span class="_ _2"></span>indows Sockets<span class="ff1">:带存档的套接字的工作方式</span></div><div class="t m0 x3 h4 y15 ff3 fs1 fc1 sc1 ls0 ws0">3.4 <span class="ff1">流式套接字通信的操作顺序</span></div><div class="t m0 x3 h4 y16 ff3 fs1 fc1 sc1 ls0 ws0">3.5 <span class="ff1">使用</span> CAsyncSocket <span class="ff1">类</span></div><div class="t m0 x3 h4 y17 ff3 fs1 fc1 sc1 ls0 ws0">3.6 <span class="ff1">从套接字类派生</span></div><div class="t m0 x3 h4 y18 ff3 fs1 fc1 sc1 ls0 ws0">3.7 <span class="ff1">套接字通知</span></div><div class="t m0 x3 h4 y19 ff3 fs1 fc1 sc1 ls0 ws0">3.8 <span class="ff1">一个使用<span class="_ _3"> </span></span>CSocket<span class="_"> </span><span class="ff1">类的网络通信实例</span></div><div class="t m0 x4 h4 y1a ff3 fs1 fc1 sc1 ls0 ws0">3.8.1 <span class="ff1">服务器端应用程序设计</span>(ServerDemo)</div><div class="t m0 x4 h4 y1b ff3 fs1 fc1 sc1 ls0 ws0">3.8.2 <span class="ff1">客户端应用程序设计</span>(<span class="ff1">项目名称<span class="_ _1"> </span></span>ClientDemo)</div><div class="t m0 x2 h4 y1c ff3 fs1 fc1 sc1 ls0 ws0">4<span class="ff1">.套接字的托管实现</span></div><div class="t m0 x3 h4 y1d ff3 fs1 fc1 sc1 ls0 ws0">4.1 System<span class="ff1">::<span class="_ _4"> </span></span>Net<span class="ff1">::<span class="_ _4"> </span></span>Sockets <span class="ff1">命名空间</span></div><div class="t m0 x3 h4 y1e ff3 fs1 fc1 sc1 ls0 ws0">4.2 <span class="ff1">实例:一个新邮件检查器</span></div><div class="t m0 x2 h3 y1f ff2 fs0 fc0 sc1 ls0 ws0">1<span class="ff1 sc0">.套接字编程原理</span></div><div class="t m0 x4 h4 y20 ff1 fs1 fc0 sc1 ls0 ws0">一个<span class="_ _5"></span>完整<span class="_ _5"></span>的网<span class="_ _5"></span>间通<span class="_ _5"></span>信进<span class="_ _5"></span>程需<span class="_ _5"></span>要由<span class="_ _5"></span>两个<span class="_ _5"></span>进程<span class="_ _5"></span>组成<span class="_ _5"></span>,并<span class="_ _5"></span>且只<span class="_ _5"></span>能用<span class="_ _5"></span>同一<span class="_ _5"></span>种高<span class="_ _5"></span>层协<span class="_ _5"></span>议。<span class="_ _5"></span>也就<span class="_ _5"></span>是</div><div class="t m0 x2 h4 y21 ff1 fs1 fc0 sc1 ls0 ws0">说,不可能<span class="_ _5"></span>通信的一端用<span class="_ _0"> </span><span class="ff3">TCP</span>,而另<span class="_ _5"></span>一端用<span class="_ _6"> </span><span class="ff3">UDP</span>。一个完整<span class="_ _5"></span>的网络信需要<span class="_ _5"></span>一个五元组来<span class="_ _5"></span>标</div><div class="t m0 x2 h4 y22 ff1 fs1 fc0 sc1 ls0 ws0">识:协议、本地地址、本地端口号、远端地址、远端端口号。</div><div class="t m0 x2 h4 y23 ff2 fs1 fc0 sc1 ls0 ws0">1.1 Client/server<span class="_ _1"> </span><span class="ff1 sc0">通信模型</span></div><div class="t m0 x4 h4 y24 ff1 fs1 fc0 sc1 ls0 ws0">在客户<span class="ff3">/</span>服务器模式中我们将请求服务的一方称为客户(<span class="ff3">client</span>),将提供某种服务的一</div><div class="t m0 x2 h4 y25 ff1 fs1 fc0 sc1 ls0 ws0">方称为服务器(<span class="ff3">server</span>)。</div><div class="t m0 x4 h4 y26 ff1 fs1 fc0 sc1 ls0 ws0">一个<span class="_ _5"></span>服务<span class="_ _5"></span>程序<span class="_ _5"></span>通常<span class="_ _5"></span>在一<span class="_ _5"></span>个众<span class="_ _5"></span>所周<span class="_ _5"></span>知的<span class="_ _5"></span>地址<span class="_ _5"></span>监听<span class="_ _5"></span>对服<span class="_ _5"></span>务的<span class="_ _5"></span>请求<span class="_ _5"></span>,也<span class="_ _5"></span>就是<span class="_ _5"></span>说服<span class="_ _5"></span>务进<span class="_ _5"></span>程一<span class="_ _5"></span>直</div><div class="t m0 x2 h4 y27 ff1 fs1 fc0 sc1 ls0 ws0">处于<span class="_ _5"></span>休眠<span class="_ _5"></span>状态<span class="_ _5"></span>,直<span class="_ _5"></span>到一<span class="_ _5"></span>个客<span class="_ _5"></span>户对<span class="_ _5"></span>这个<span class="_ _5"></span>服务<span class="_ _5"></span>的地<span class="_ _5"></span>址提<span class="_ _5"></span>出了<span class="_ _5"></span>连接<span class="_ _5"></span>请求<span class="_ _5"></span>。在<span class="_ _5"></span>这个<span class="_ _5"></span>时刻<span class="_ _5"></span>,服<span class="_ _5"></span>务程<span class="_ _5"></span>序</div><div class="t m0 x2 h4 y28 ff1 fs1 fc0 sc1 ls0 ws0">被“<span class="_ _5"></span>惊<span class="_ _5"></span>醒”<span class="_ _5"></span>并<span class="_ _5"></span>且为<span class="_ _5"></span>客<span class="_ _5"></span>户提<span class="_ _5"></span>供<span class="_ _5"></span>服务<span class="_ _7"></span>—对<span class="_ _5"></span>客<span class="_ _5"></span>户的<span class="_ _5"></span>请<span class="_ _5"></span>求作<span class="_ _5"></span>出<span class="_ _5"></span>适当<span class="_ _5"></span>的<span class="_ _5"></span>反应<span class="_ _5"></span>。<span class="_ _5"></span>虽然<span class="_ _5"></span>基<span class="_ _5"></span>于连<span class="_ _5"></span>接<span class="_ _5"></span>的服<span class="_ _5"></span>务<span class="_ _5"></span>是设</div><div class="t m0 x2 h4 y29 ff1 fs1 fc0 sc1 ls0 ws0">计客户机<span class="ff3">/</span>服务器应用程序时的标准,但有些服务也是可以通过无连接的接口提供的。</div><div class="t m0 x4 h4 y2a ff1 fs1 fc0 sc1 ls0 ws0">客户机<span class="ff3">/</span>服务器的请求<span class="ff3">/</span>响应过程示意图如下所示。</div></div></div><div class="pi" data-data='{"ctm":[1.611850,0.000000,0.000000,1.611850,0.000000,0.000000]}'></div></div>
</body>
</html>
<div id="pf2" class="pf w0 h0" data-page-no="2"><div class="pc pc2 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/622b326e81ded46b7f2f204d/bg2.jpg"><div class="c x0 y1 w2 h2"><div class="t m0 x5 h4 yb ff1 fs1 fc0 sc1 ls0 ws0">图<span class="_ _3"> </span><span class="ff3">1 </span>客户<span class="ff3">/</span>服务器通信模型</div><div class="t m0 x4 h4 yc ff1 fs1 fc0 sc1 ls0 ws0">通过<span class="_ _5"></span>上面<span class="_ _5"></span>的分<span class="_ _5"></span>析,<span class="_ _5"></span>我们<span class="_ _5"></span>不难<span class="_ _5"></span>理解<span class="_ _5"></span>一个<span class="_ _5"></span>一个<span class="_ _5"></span>完整<span class="_ _5"></span>的网<span class="_ _5"></span>络应<span class="_ _5"></span>用程<span class="_ _5"></span>序包<span class="_ _5"></span>括客<span class="_ _5"></span>户端<span class="_ _5"></span>和服<span class="_ _5"></span>务器<span class="_ _5"></span>两</div><div class="t m0 x2 h4 yd ff1 fs1 fc0 sc1 ls0 ws0">个部<span class="_ _5"></span>分。<span class="_ _5"></span>客户<span class="_ _5"></span>与服<span class="_ _5"></span>务器<span class="_ _5"></span>进程<span class="_ _5"></span>的作<span class="_ _5"></span>用是<span class="_ _5"></span>非对<span class="_ _5"></span>称的<span class="_ _5"></span>,因<span class="_ _5"></span>此编<span class="_ _5"></span>码不<span class="_ _5"></span>同。<span class="_ _5"></span>服务<span class="_ _5"></span>进程<span class="_ _5"></span>一般<span class="_ _5"></span>是等<span class="_ _5"></span>待客<span class="_ _5"></span>户</div><div class="t m0 x2 h4 ye ff1 fs1 fc0 sc1 ls0 ws0">请求而启动的,只要系统运行,该服务进程一直存在,直到终止或强迫终止。</div><div class="t m0 x2 h4 yf ff3 fs1 fc0 sc1 ls0 ws0">1.2 W<span class="_ _2"></span>indows Sockets<span class="_ _3"> </span><span class="ff1">规范</span></div><div class="t m0 x4 h4 y10 ff3 fs1 fc0 sc1 ls0 ws0">W<span class="_ _2"></span>indows <span class="_ _5"></span>Sockets <span class="_ _5"></span><span class="ff1">规<span class="_ _5"></span>范是<span class="_ _1"> </span></span>90<span class="_"> </span><span class="ff1">年代初<span class="_ _1"> </span></span>Microsoft<span class="_"> </span><span class="ff1">公司联<span class="_ _5"></span>合其<span class="_ _5"></span>他几<span class="_ _5"></span>家大<span class="_ _5"></span>公司<span class="_ _5"></span>共同<span class="_ _5"></span>制定<span class="_ _5"></span>的一<span class="_ _5"></span>套</span></div><div class="t m0 x2 h4 y11 ff1 fs1 fc0 sc1 ls0 ws0">在<span class="_ _1"> </span><span class="ff3">W<span class="_ _2"></span>indows<span class="_"> </span><span class="ff1">下的二进制<span class="_ _5"></span>兼容网<span class="_ _5"></span>络编程<span class="_ _5"></span>接口<span class="_ _8"></span>规范。<span class="_ _5"></span>它以<span class="_ _1"> </span></span>U.C.Berkeley<span class="_"> </span><span class="ff1">大学<span class="_ _1"> </span></span>BSD UNIX<span class="_ _1"> </span><span class="ff1">中<span class="_ _5"></span>流行</span></span></div><div class="t m0 x2 h4 y12 ff1 fs1 fc0 sc1 ls0 ws0">的<span class="_ _6"> </span><span class="ff3">Socket<span class="_"> </span></span>接<span class="_ _5"></span>口<span class="_ _5"></span>为<span class="_ _5"></span>基<span class="_ _8"></span>础<span class="_ _5"></span>,<span class="_ _5"></span>主<span class="_ _5"></span>要<span class="_ _8"></span>在其<span class="_ _8"></span>上扩<span class="_ _8"></span>充了<span class="_ _8"></span>一组<span class="_ _8"></span>针对<span class="_ _0"> </span><span class="ff3">Windows<span class="_"> </span></span>的扩<span class="_ _8"></span>展库<span class="_ _8"></span>函数<span class="_ _8"></span>,增<span class="_ _8"></span>加了<span class="_ _8"></span>符合</div><div class="t m0 x2 h4 y13 ff3 fs1 fc0 sc1 ls0 ws0">W<span class="_ _2"></span>indows<span class="_"> </span><span class="ff1">消息驱动特<span class="_ _5"></span>性的网<span class="_ _5"></span>络事件<span class="_ _5"></span>异步选<span class="_ _5"></span>择机制<span class="_ _5"></span>,以使<span class="_ _5"></span>程序员<span class="_ _5"></span>能够充<span class="_ _5"></span>分利用<span class="_ _0"> </span></span>Windows<span class="_ _3"> </span><span class="ff1">消<span class="_ _5"></span>息</span></div><div class="t m0 x2 h4 y14 ff1 fs1 fc0 sc1 ls0 ws0">驱动机制进行编程。</div><div class="t m0 x4 h4 y15 ff3 fs1 fc0 sc1 ls0 ws0">W<span class="_ _2"></span>indows Sockets <span class="_ _5"></span><span class="ff1">的用途<span class="_ _5"></span>是将基础网络<span class="_ _5"></span>抽象出来,这<span class="_ _5"></span>样,您不必对<span class="_ _5"></span>网络非常了解<span class="_ _5"></span>,并且</span></div><div class="t m0 x2 h5 y16 ff1 fs1 fc0 sc1 ls0 ws0">您的<span class="_ _5"></span>应用<span class="_ _5"></span>程序<span class="_ _5"></span>可在<span class="_ _5"></span>任<span class="_ _5"></span><span class="ff4">何支<span class="_ _5"></span>持</span>套<span class="_ _5"></span>接字<span class="_ _5"></span>的网<span class="_ _5"></span>络上<span class="_ _5"></span>运行<span class="_ _5"></span>。<span class="_ _5"></span>它为<span class="_ _5"></span>应用<span class="_ _5"></span>程序<span class="_ _5"></span><span class="ff4">开发<span class="_ _5"></span>者</span>定<span class="_ _5"></span>义了<span class="_ _5"></span>一套<span class="_ _5"></span><span class="ff4">简单<span class="_ _5"></span></span>统</div><div class="t m0 x2 h5 y17 ff1 fs1 fc0 sc1 ls0 ws0">一的<span class="_ _3"> </span><span class="ff3">API<span class="_ _5"></span></span>,并<span class="ff4">让各</span>家网络<span class="ff4">软</span>件供应<span class="ff4">商</span>共同<span class="ff4">遵守</span>。</div><div class="t m0 x6 h5 y18 ff3 fs1 fc0 sc1 ls0 ws0">W<span class="_ _2"></span>indows Sockets<span class="_ _1"> </span><span class="ff1">规范从<span class="_ _1"> </span></span>90<span class="_ _1"> </span><span class="ff1">年代初的<span class="_ _1"> </span></span>1.0<span class="_ _3"> </span><span class="ff4">版<span class="ff1">本</span>开始<span class="ff1">,</span>经<span class="ff1">过不</span>断<span class="ff1">的完</span>善<span class="ff1">和</span>发<span class="ff1">展,目</span>前已经</span></div><div class="t m0 x2 h5 y19 ff1 fs1 fc0 sc1 ls0 ws0">有<span class="_ _8"></span>了<span class="_ _6"> </span><span class="ff3">Windows <span class="_ _8"></span>S<span class="_ _9"></span>ockets<span class="_ _5"></span> <span class="_ _5"></span>2<span class="_ _0"> </span><span class="ff4">版<span class="_ _8"></span><span class="ff1">本<span class="_ _8"></span>。<span class="_ _8"></span></span>值<span class="_ _8"></span>得<span class="_ _8"></span>注<span class="_ _8"></span><span class="ff1">意<span class="_ _5"></span>的<span class="_ _8"></span>是<span class="_ _8"></span>,<span class="_ _8"></span></span></span>Microsoft<span class="_"> </span><span class="ff1">的<span class="_ _0"> </span></span>M<span class="_ _5"></span>FC<span class="_"> </span><span class="ff1">库<span class="_ _8"></span>现<span class="_ _8"></span>在<span class="_ _8"></span>只<span class="_ _8"></span><span class="ff4">支<span class="_ _8"></span>持<span class="_ _6"> </span></span></span>W<span class="_ _9"></span>indows</span></div><div class="t m0 x2 h5 y1a ff3 fs1 fc0 sc1 ls0 ws0">Sockets 1<span class="_ _1"> </span><span class="ff4">版<span class="ff1">本,不</span>支持<span class="_ _3"> </span></span>Wi<span class="_ _2"></span>n<span class="_ _5"></span>dows Sockets 2<span class="_ _1"> </span><span class="ff4">版<span class="ff1">本。</span></span></div><div class="t m0 x6 h5 y1b ff3 fs1 fc0 sc1 ls0 ws0">MFC<span class="_"> </span><span class="ff1">提供<span class="_ _5"></span>了<span class="_ _5"></span>两<span class="_ _5"></span>个<span class="_ _5"></span>类<span class="_ _5"></span>用<span class="_ _5"></span>以<span class="_ _5"></span><span class="ff4">封<span class="_ _5"></span>装<span class="_ _6"> </span></span></span>W<span class="_ _9"></span>indows Socke<span class="_ _5"></span>ts <span class="_ _2"></span>API<span class="_ _8"></span><span class="ff1">。一<span class="_ _5"></span>个<span class="_ _5"></span>是<span class="_ _6"> </span></span>CAsyncSocket<span class="_"> </span><span class="ff1">类,<span class="_ _5"></span>它<span class="_ _8"></span>主要</span></div><div class="t m0 x2 h5 y1c ff1 fs1 fc0 sc1 ls0 ws0">是提<span class="_ _5"></span>供<span class="ff4">给<span class="_ _5"></span>那</span>些<span class="_ _5"></span><span class="ff4">具</span>有<span class="_ _5"></span>一定<span class="_ _5"></span>网络<span class="_ _5"></span>编程<span class="_ _5"></span><span class="ff4">经<span class="_ _5"></span>验</span>,<span class="_ _5"></span><span class="ff4">希望<span class="_ _5"></span></span>同时<span class="_ _5"></span><span class="ff4">拥</span>有<span class="_ _a"> </span><span class="ff3">Socket <span class="_ _2"></span>API<span class="_"> </span><span class="ff1">编程的<span class="_ _5"></span><span class="ff4">灵活<span class="_ _5"></span></span>性和<span class="_ _5"></span>类库<span class="_ _5"></span>编程</span></span></div><div class="t m0 x2 h5 y1d ff4 fs1 fc0 sc1 ls0 ws0">便<span class="ff1">利性<span class="_ _5"></span>的</span>开发<span class="_ _5"></span>者<span class="ff1">的。<span class="_ _5"></span>另一个<span class="_ _5"></span>是<span class="_ _0"> </span><span class="ff3">CSocket<span class="_ _1"> </span></span>类,<span class="_ _5"></span>它由<span class="_ _6"> </span><span class="ff3">CAsyncSocket<span class="_ _1"> </span></span>类派<span class="_ _5"></span>生,它<span class="_ _5"></span></span>具<span class="ff1">有</span>更<span class="_ _5"></span><span class="ff1">高的抽<span class="_ _5"></span>象</span></div><div class="t m0 x2 h5 y1e ff4 fs1 fc0 sc1 ls0 ws0">化<span class="ff1">,</span>致力<span class="ff1">于</span>简化<span class="ff1">网络编程所需的操作。</span></div><div class="t m0 x2 h4 y2b ff2 fs1 fc0 sc1 ls0 ws0">1.3 <span class="ff1 sc0">套接字</span></div><div class="t m0 x2 h4 y2c ff2 fs1 fc0 sc1 ls0 ws0">1.3.1 <span class="ff1 sc0">套接字定义</span></div><div class="t m0 x6 h5 y2d ff1 fs1 fc0 sc1 ls0 ws0">套接<span class="_ _5"></span>字<span class="_ _5"></span>是<span class="_ _5"></span>一<span class="_ _5"></span>个<span class="_ _5"></span>通信<span class="_ _5"></span>终<span class="_ _5"></span>结<span class="_ _5"></span><span class="ff4">点<span class="_ _5"></span></span>,<span class="_ _5"></span>它<span class="_ _5"></span>是<span class="_ _0"> </span><span class="ff3">Sockets<span class="_ _5"></span> <span class="_ _5"></span></span>应<span class="_ _5"></span>用<span class="_ _5"></span>程<span class="_ _5"></span>序<span class="_ _5"></span>用来<span class="_ _5"></span>在<span class="_ _5"></span>网<span class="_ _5"></span>络<span class="_ _5"></span>上<span class="_ _5"></span><span class="ff4">发<span class="_ _5"></span>送<span class="_ _5"></span></span>或接<span class="_ _8"></span><span class="ff4">收</span>数<span class="_ _5"></span><span class="ff4">据</span>包<span class="_ _5"></span>的</div><div class="t m0 x2 h5 y20 ff1 fs1 fc0 sc1 ls0 ws0">对象<span class="_ _5"></span>。套<span class="_ _5"></span>接字<span class="_ _5"></span><span class="ff4">具</span>有<span class="_ _5"></span>类型<span class="_ _5"></span>,与<span class="_ _5"></span><span class="ff4">正<span class="_ _5"></span></span>在运<span class="_ _5"></span>行的<span class="_ _5"></span>进程<span class="_ _5"></span><span class="ff4">相关<span class="_ _5"></span></span>联,<span class="_ _5"></span>并且<span class="_ _5"></span>可以<span class="_ _5"></span>有名<span class="_ _5"></span>称。<span class="_ _5"></span>目<span class="_ _5"></span><span class="ff4">前</span>,<span class="_ _5"></span>套接<span class="_ _5"></span>字一<span class="_ _5"></span>般</div><div class="t m0 x2 h5 y21 ff1 fs1 fc0 sc1 ls0 ws0">只与<span class="_ _5"></span>使<span class="_ _5"></span>用网<span class="_ _5"></span><span class="ff4">际<span class="_ _5"></span></span>协<span class="_ _5"></span>议组<span class="_ _5"></span>的<span class="_ _5"></span>同一<span class="_ _5"></span>“<span class="_ _5"></span>通信<span class="_ _5"></span><span class="ff4">域<span class="_ _5"></span></span>”<span class="_ _5"></span>中的<span class="_ _5"></span>其<span class="_ _5"></span>他套<span class="_ _5"></span>接<span class="_ _5"></span>字<span class="_ _5"></span><span class="ff4">交换<span class="_ _5"></span></span>数<span class="_ _5"></span><span class="ff4">据</span>。<span class="_ _b"> </span>使用<span class="_ _5"></span>套<span class="_ _5"></span>接字<span class="_ _5"></span>的<span class="_ _5"></span>应用<span class="_ _5"></span>程<span class="_ _5"></span>序间</div><div class="t m0 x2 h4 y22 ff1 fs1 fc0 sc1 ls0 ws0">通信模型如图<span class="_ _3"> </span><span class="ff3">2<span class="_ _1"> </span></span>所示。</div><div class="t m0 x2 h4 y27 ff2 fs1 fc0 sc1 ls0 ws0">1.3.2<span class="_ _3"> </span><span class="ff1 sc0">分类</span></div><div class="t m0 x6 h4 y28 ff1 fs1 fc0 sc1 ls0 ws0">可用的套接字类型有以下两种:<span class="ff3"> </span></div><div class="t m0 x7 h4 y29 ff2 fs1 fc0 sc1 ls0 ws0">1.3.2.1<span class="_ _3"> </span><span class="ff1 sc0">流式套接字</span> </div><div class="t m0 x6 h5 y2a ff1 fs1 fc0 sc1 ls0 ws0">流式套<span class="_ _5"></span>接字提<span class="_ _5"></span>供<span class="ff4">没</span>有<span class="_ _5"></span><span class="ff4">记录边<span class="_ _5"></span>界</span>的<span class="_ _5"></span>数<span class="ff4">据</span>流<span class="_ _5"></span>,<span class="ff4">即</span>字<span class="_ _5"></span><span class="ff4">节</span>流。<span class="_ _5"></span>字<span class="ff4">节</span>流<span class="_ _5"></span>能<span class="ff4">确保<span class="_ _5"></span></span>以<span class="ff4">正<span class="_ _5"></span>确</span>的顺<span class="_ _5"></span>序无<span class="ff4">重</span></div></div></div><div class="pi" data-data='{"ctm":[1.611850,0.000000,0.000000,1.611850,0.000000,0.000000]}'></div></div>
<div id="pf3" class="pf w0 h0" data-page-no="3"><div class="pc pc3 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/622b326e81ded46b7f2f204d/bg3.jpg"><div class="c x0 y1 w2 h2"><div class="t m0 x2 h5 y2e ff4 fs1 fc0 sc1 ls0 ws0">复<span class="ff1">地被</span>送达<span class="ff1">。<span class="ff3"> </span></span></div><div class="t m0 x7 h5 yd ff2 fs1 fc0 sc1 ls0 ws0">1.3.2.2<span class="_ _c"> </span><span class="ff1 sc0">数<span class="ff4">据报</span>套接字</span> </div><div class="t m0 x6 h5 ye ff1 fs1 fc0 sc1 ls0 ws0">数<span class="ff4">据报<span class="_ _5"></span></span>套接字<span class="_ _5"></span><span class="ff4">支持</span>面<span class="_ _5"></span><span class="ff4">向记录<span class="_ _5"></span></span>的数<span class="_ _5"></span><span class="ff4">据</span>流,<span class="_ _5"></span>但不能<span class="_ _5"></span><span class="ff4">确保</span>能<span class="_ _5"></span>被<span class="ff4">送达<span class="_ _5"></span></span>,也无<span class="_ _5"></span>法<span class="ff4">确<span class="_ _5"></span>保按照<span class="_ _5"></span>发送</span>顺</div><div class="t m0 x2 h5 yf ff1 fs1 fc0 sc1 ls0 ws0">序或不<span class="ff4">重复</span>。<span class="ff3"> </span></div><div class="t m0 x6 h5 y1b ff3 fs1 fc0 sc1 ls0 ws0">“<span class="ff1">有序”<span class="ff4">指</span>数<span class="ff4">据</span>包<span class="ff4">按发送</span>的顺序<span class="ff4">送达</span>。“不<span class="ff4">重复</span>”<span class="ff4">指</span>一个特定的数<span class="ff4">据</span>包只能<span class="ff4">获取</span>一<span class="ff4">次</span>。这两</span></div><div class="t m0 x2 h5 y1c ff1 fs1 fc0 sc1 ls0 ws0">种套接字<span class="ff4">都</span>是<span class="ff4">双向</span>的,是可以同时在两个方<span class="ff4">向</span>上(<span class="ff4">全双</span>工)进行通信的数<span class="ff4">据</span>流。</div><div class="t m0 x6 h5 y1d ff4 fs1 fc0 sc0 ls0 ws0">注<span class="ff1">意</span><span class="sc1">KKK<span class="ff1">在某些网络协议下(如<span class="ff3"> XNS</span>),流可以面</span>向记录<span class="ff1">,</span>即<span class="ff1">作为</span>记录<span class="ff1">流而非字</span>节<span class="ff1">流。</span></span></div><div class="t m0 x2 h5 y1e ff1 fs1 fc0 sc1 ls0 ws0">但在<span class="_ _5"></span><span class="ff4">更<span class="_ _5"></span></span>常用<span class="_ _5"></span>的<span class="_ _5"></span><span class="ff3"> <span class="_ _5"></span>TCP/IP </span>协<span class="_ _5"></span>议下<span class="_ _5"></span>,<span class="_ _5"></span>流为<span class="_ _5"></span>字<span class="_ _5"></span><span class="ff4">节<span class="_ _5"></span></span>流。<span class="_ _8"></span><span class="ff3">W<span class="_ _2"></span>indows Sockets<span class="_ _5"></span> <span class="_ _5"></span><span class="ff1">提<span class="_ _5"></span>供<span class="_ _5"></span>与基<span class="_ _5"></span>础<span class="_ _5"></span>协议<span class="_ _5"></span>无<span class="_ _5"></span><span class="ff4">关<span class="_ _5"></span></span>的抽<span class="_ _5"></span>象</span></span></div><div class="t m0 x2 h5 y2b ff4 fs1 fc0 sc1 ls0 ws0">化级别<span class="ff1">。</span></div><div class="t m0 x2 h4 y2c ff2 fs1 fc0 sc1 ls0 ws0">1.3.3 <span class="ff1 sc0">套接字的作用</span></div><div class="t m0 x4 h5 y2d ff1 fs1 fc0 sc1 ls0 ws0">套接字的作用非常大,<span class="ff4">至少</span>在下面<span class="ff4">三</span>种通信上下<span class="ff4">文</span>中如此:<span class="ff3"> </span></div><div class="t m0 x8 h4 y20 ff5 fs1 fc0 sc1 ls0 ws0"><span class="_ _d"> </span><span class="ff1">客户端<span class="ff3">/</span>服务器模型。<span class="ff3"> </span></span></div><div class="t m0 x8 h5 y21 ff5 fs1 fc0 sc1 ls0 ws0"><span class="_ _d"> </span><span class="ff1">对等网络方<span class="ff4">案</span>,如<span class="ff4">聊天</span>应用程序。<span class="ff3"> </span></span></div><div class="t m0 x8 h5 y22 ff5 fs1 fc0 sc1 ls0 ws0"><span class="_ _d"> </span><span class="ff1">通过<span class="ff4">让</span>接<span class="ff4">收</span>应用程序将消息解<span class="ff4">释</span>为函数<span class="ff4">调</span>用来进行远程过程<span class="ff4">调</span>用<span class="ff3"> (RPC)</span>。<span class="ff3"> </span></span></div><div class="t m0 x2 h4 y23 ff2 fs1 fc0 sc1 ls0 ws0">1.3.4<span class="_ _3"> </span><span class="ff1 sc0">端口与地址</span></div><div class="t m0 x4 h5 y24 ff1 fs1 fc0 sc1 ls0 ws0">在网络上,一个套接字的标识主要<span class="ff4">借助</span>于地址和端口来<span class="ff4">描述</span>。</div><div class="t m0 x6 h5 y25 ff1 fs1 fc0 sc1 ls0 ws0">套接字的地址<span class="_ _5"></span><span class="ff4">指</span>该套接字所<span class="_ _5"></span>在计<span class="ff4">算</span>机的网<span class="_ _5"></span>络地址,可以<span class="_ _5"></span>为<span class="ff4">域</span>名或<span class="_ _6"> </span><span class="ff3">IP<span class="_ _3"> </span></span>地址<span class="_ _5"></span>的<span class="ff4">形</span>式。通常<span class="_ _5"></span>,</div><div class="t m0 x2 h5 y26 ff4 fs1 fc0 sc1 ls0 ws0">创建<span class="_ _5"></span><span class="ff1">套接<span class="_ _5"></span>字时<span class="_ _5"></span>不必<span class="_ _5"></span></span>指<span class="_ _5"></span>明<span class="ff1">网<span class="_ _5"></span>络地<span class="_ _5"></span>址,<span class="_ _5"></span>只有<span class="_ _5"></span>在</span>拥<span class="_ _5"></span><span class="ff1">有</span>多<span class="_ _5"></span><span class="ff1">个网<span class="_ _5"></span>络地<span class="_ _5"></span>址的<span class="_ _5"></span>机器<span class="_ _5"></span>时,<span class="_ _5"></span></span>才<span class="_ _5"></span><span class="ff1">需要<span class="_ _5"></span></span>显<span class="ff1">式<span class="_ _5"></span></span>指<span class="ff1">定<span class="_ _5"></span>一</span></div><div class="t m0 x2 h4 y27 ff1 fs1 fc0 sc1 ls0 ws0">个网络地址。</div><div class="t m0 x6 h5 y28 ff1 fs1 fc0 sc1 ls0 ws0">同一机<span class="_ _5"></span>器上可<span class="_ _5"></span>以运行<span class="_ _5"></span><span class="ff4">多</span>个网<span class="_ _5"></span>络应用<span class="_ _5"></span>程序,<span class="_ _5"></span><span class="ff4">每</span>个<span class="_ _5"></span>应用程<span class="_ _5"></span>序<span class="ff4">都</span>有<span class="_ _5"></span><span class="ff4">自己</span>的<span class="_ _5"></span>套接字<span class="_ _5"></span>用以进<span class="_ _5"></span>行网</div><div class="t m0 x2 h5 y29 ff1 fs1 fc0 sc1 ls0 ws0">络通<span class="_ _5"></span>信,<span class="_ _5"></span>此时<span class="_ _5"></span>如<span class="ff4">果<span class="_ _5"></span></span>只<span class="_ _5"></span>有地<span class="_ _5"></span>址标<span class="_ _5"></span>识套<span class="_ _5"></span>接字<span class="_ _5"></span>,<span class="ff4">则<span class="_ _5"></span></span>当一<span class="_ _5"></span>个通<span class="_ _5"></span>信包<span class="_ _5"></span>到<span class="ff4">达<span class="_ _5"></span></span>机器<span class="_ _5"></span>时,<span class="_ _5"></span>将无<span class="_ _5"></span>法<span class="_ _5"></span><span class="ff4">确</span>定<span class="_ _5"></span><span class="ff4">究竟<span class="_ _5"></span></span>是</div><div class="t m0 x2 h5 y2a ff4 fs1 fc0 sc1 ls0 ws0">哪<span class="ff1">个<span class="_ _5"></span>应用<span class="_ _5"></span>程序<span class="_ _5"></span>的套<span class="_ _5"></span>接字<span class="_ _5"></span>需要<span class="_ _5"></span>接<span class="_ _5"></span></span>收<span class="ff1">此<span class="_ _5"></span>信息<span class="_ _5"></span>。由<span class="_ _5"></span>此增<span class="_ _5"></span>加了<span class="_ _5"></span>端口<span class="_ _5"></span>的</span>概<span class="_ _5"></span>念<span class="ff1">,<span class="_ _5"></span>以协<span class="_ _5"></span></span>助<span class="_ _5"></span>区<span class="ff1">分<span class="_ _5"></span>同一<span class="_ _5"></span>机器<span class="_ _5"></span>上</span></div></div></div><div class="pi" data-data='{"ctm":[1.611850,0.000000,0.000000,1.611850,0.000000,0.000000]}'></div></div>
<div id="pf4" class="pf w0 h0" data-page-no="4"><div class="pc pc4 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/622b326e81ded46b7f2f204d/bg4.jpg"><div class="c x0 y1 w2 h2"><div class="t m0 x2 h4 y2e ff1 fs1 fc0 sc1 ls0 ws0">不同应用程序的套接字。</div><div class="t m0 x6 h5 y2f ff1 fs1 fc0 sc1 ls0 ws0">端口用于标识进程,同一机器上不同的网络应用程序<span class="ff4">各</span>有不同的端口,这样,通过“网</div><div class="t m0 x2 h5 y3 ff1 fs1 fc0 sc1 ls0 ws0">络地址<span class="ff3">+</span>端口号”的标识方法,<span class="ff4">便唯</span>一标识了机器上的应用程序了。</div><div class="t m0 x6 h5 y4 ff1 fs1 fc0 sc1 ls0 ws0">某些端口是<span class="ff4">专<span class="_ _5"></span>门</span>为公共服务<span class="_ _5"></span><span class="ff4">保留</span>的(<span class="_ _8"></span><span class="ff3">Ftp:21,http:80<span class="_ _5"></span></span>),<span class="ff4">除</span>非程序<span class="_ _5"></span>是要提供这些<span class="_ _5"></span>服务,</div><div class="t m0 x2 h5 y5 ff4 fs1 fc0 sc1 ls0 ws0">否则<span class="ff1">应</span>尽量避免<span class="ff1">使用这些端口。一般来说,端口<span class="_ _0"> </span><span class="ff3">1024<span class="_ _1"> </span></span>以</span>前<span class="ff1">的端口号</span>都<span class="ff1">是系统</span>保留<span class="ff1">的或是作</span></div><div class="t m0 x2 h5 y6 ff1 fs1 fc0 sc1 ls0 ws0">为公共服务的,应<span class="ff4">尽量</span>选择大于<span class="_ _3"> </span><span class="ff3">1024<span class="_ _1"> </span></span>的端口号,以<span class="ff4">避免冲突</span>。</div><div class="t m0 x2 h4 y7 ff3 fs1 fc0 sc1 ls0 ws0">1.3.5 <span class="ff1">套接口属性</span></div><div class="t m0 x2 h5 y8 ff1 fs1 fc0 sc1 ls0 ws0">套接口有一系<span class="ff4">列</span>的属性用于标识套接口的状态等信息,它们的属性如<span class="ff4">表<span class="_ _3"> </span><span class="ff3">1<span class="_ _1"> </span></span></span>所示。</div><div class="t m0 x2 h5 y9 ff4 fs1 fc0 sc0 ls0 ws0">表<span class="_ _3"> </span><span class="ff2 sc1">1 </span><span class="ff1">套接口属性</span></div><div class="t m0 x2 h5 y30 ff1 fs1 fc0 sc1 ls0 ws0">选项<span class="_ _e"> </span>类型<span class="_ _f"> </span><span class="ff4">含</span>义<span class="_ _10"> </span><span class="ff4">缺省值</span></div><div class="t m0 x2 h6 y31 ff3 fs1 fc0 sc1 ls0 ws0">SO_ACCEPTCON<span class="_ _11"> </span>BOOL</div><div class="t m0 x9 h5 y32 ff1 fs1 fc0 sc1 ls0 ws0">套接口<span class="ff4">正</span>在监听</div><div class="t m0 xa h6 y31 ff3 fs1 fc0 sc1 ls0 ws0">F<span class="_ _2"></span>ALSE</div><div class="t m0 x2 h6 y33 ff3 fs1 fc0 sc1 ls0 ws0">SO_BROADCAST<span class="_ _12"> </span>BOOL</div><div class="t m0 x9 h5 y34 ff1 fs1 fc0 sc1 ls0 ws0">套接口设<span class="ff4">置</span>为可<span class="ff4">发送广播</span>数<span class="ff4">据</span></div><div class="t m0 xa h6 y33 ff3 fs1 fc0 sc1 ls0 ws0">F<span class="_ _2"></span>ALSE</div><div class="t m0 x2 h6 y35 ff3 fs1 fc0 sc1 ls0 ws0">SO_DEBUG<span class="_ _13"> </span>BOOL</div><div class="t m0 x9 h5 y36 ff4 fs1 fc0 sc1 ls0 ws0">允许<span class="_ _3"> </span><span class="ff3">Debug</span></div><div class="t m0 xa h6 y35 ff3 fs1 fc0 sc1 ls0 ws0">F<span class="_ _2"></span>ALSE</div><div class="t m0 x2 h6 y37 ff3 fs1 fc0 sc1 ls0 ws0">SO_DONTLINGER<span class="_ _14"> </span>BOOL</div><div class="t m0 x9 h5 y38 ff1 fs1 fc0 sc1 ls0 ws0">是<span class="ff4">否禁</span>止<span class="_ _3"> </span><span class="ff3">SO_LINGER<span class="_ _1"> </span></span>选项</div><div class="t m0 xa h6 y37 ff3 fs1 fc0 sc1 ls0 ws0">TRUE</div><div class="t m0 x2 h6 y39 ff3 fs1 fc0 sc1 ls0 ws0">SO_DONTROUTE<span class="_ _15"> </span>BOOL</div><div class="t m0 x9 h5 y3a ff4 fs1 fc0 sc1 ls0 ws0">路<span class="ff1">由被</span>禁<span class="ff1">止</span></div><div class="t m0 xa h6 y39 ff3 fs1 fc0 sc1 ls0 ws0">F<span class="_ _2"></span>ALSE</div><div class="t m0 x2 h6 y3b ff3 fs1 fc0 sc1 ls0 ws0">SO_ERROR<span class="_ _16"> </span>int</div><div class="t m0 x9 h5 y3c ff4 fs1 fc0 sc1 ls0 ws0">得<span class="ff1">到并且</span>清除错误<span class="ff1">状态</span></div><div class="t m0 xa h6 y3b ff3 fs1 fc0 sc1 ls0 ws0">0</div><div class="t m0 x2 h6 y3d ff3 fs1 fc0 sc1 ls0 ws0">SO_KEEP<span class="_ _17"></span>ALIVE<span class="_ _18"> </span>BOOL</div><div class="t m0 x9 h5 y3e ff4 fs1 fc0 sc1 ls0 ws0">活跃<span class="ff1">信息</span>正<span class="ff1">在被</span>发送</div><div class="t m0 xa h6 y3d ff3 fs1 fc0 sc1 ls0 ws0">F<span class="_ _17"></span>ALSE</div><div class="t m0 x2 h6 y3f ff3 fs1 fc0 sc1 ls0 ws0">SO_LINGER<span class="_ _19"> </span>struct</div><div class="t m0 x9 h5 y40 ff4 fs1 fc0 sc1 ls0 ws0">返回<span class="ff1">目</span>前<span class="ff1">的<span class="_ _3"> </span><span class="ff3">linger<span class="_ _1"> </span></span>信息</span></div><div class="t m0 xa h6 y3f ff3 fs1 fc0 sc1 ls0 ws0">1_onoff</div><div class="t m0 x2 h6 y41 ff3 fs1 fc0 sc1 ls0 ws0">SO_OOBINLINE<span class="_ _1a"> </span>BOOL</div><div class="t m0 x9 h5 y42 ff1 fs1 fc0 sc1 ls0 ws0">带<span class="ff4">外</span>数<span class="ff4">据正</span>在<span class="ff4">普</span>通数<span class="ff4">据</span>流中被接<span class="ff4">收</span></div><div class="t m0 xa h6 y41 ff3 fs1 fc0 sc1 ls0 ws0">F<span class="_ _17"></span>ALSE</div><div class="t m0 x2 h6 y43 ff3 fs1 fc0 sc1 ls0 ws0">SO_RCVBUF<span class="_ _1b"> </span>int</div><div class="t m0 x9 h5 y44 ff1 fs1 fc0 sc1 ls0 ws0">接<span class="ff4">收缓冲区</span>大<span class="ff4">小<span class="_ _1c"> </span></span>与<span class="ff4">具体</span>实现有<span class="ff4">关</span></div><div class="t m0 x2 h6 y45 ff3 fs1 fc0 sc1 ls0 ws0">SO_REUSEADDR<span class="_ _1d"> </span>BOOL</div><div class="t m0 x9 h5 y46 ff1 fs1 fc0 sc1 ls0 ws0">该套接口<span class="ff4">捆绑</span>的地址可<span class="ff4">否</span>被他<span class="ff4">人</span>使用</div><div class="t m0 xa h6 y45 ff3 fs1 fc0 sc1 ls0 ws0">F<span class="_ _17"></span>ALSE</div><div class="t m0 x2 h6 y47 ff3 fs1 fc0 sc1 ls0 ws0">SO_SNDBUF<span class="_ _1e"> </span>int</div><div class="t m0 x9 h5 y48 ff4 fs1 fc0 sc1 ls0 ws0">发送缓冲区<span class="ff1">大</span>小<span class="_ _1c"> </span><span class="ff1">与</span>具体<span class="ff1">实现有</span>关</div><div class="t m0 x2 h6 y49 ff3 fs1 fc0 sc1 ls0 ws0">SO_TYPE<span class="_ _1f"> </span>int</div><div class="t m0 x9 h5 y4a ff1 fs1 fc0 sc1 ls0 ws0">套接口类型<span class="_ _20"> </span>与接口类型有<span class="ff4">关</span></div><div class="t m0 x2 h6 y4b ff3 fs1 fc0 sc1 ls0 ws0">TCP_NODELA<span class="_ _17"></span>Y<span class="_ _21"> </span>BOOL</div><div class="t m0 x9 h5 y4c ff4 fs1 fc0 sc1 ls0 ws0">禁<span class="ff1">止</span>采<span class="ff1">用<span class="_ _3"> </span><span class="ff3">Nagle<span class="_ _1"> </span></span>进行合并</span>传送<span class="_ _22"> </span><span class="ff1">与</span>具体<span class="ff1">实现有</span>关</div><div class="t m0 x4 h5 y4d ff1 fs1 fc0 sc0 ls0 ws0">可<span class="_ _5"></span>以<span class="_ _5"></span>通<span class="_ _5"></span>过<span class="_ _6"> </span><span class="ff2 sc1">getsockopt()<span class="_ _5"></span></span>函<span class="_ _5"></span>数<span class="_ _5"></span><span class="ff4">获<span class="_ _5"></span>取<span class="_ _5"></span></span>套<span class="_ _5"></span>接<span class="_ _5"></span>口<span class="_ _5"></span>的<span class="_ _5"></span>属<span class="_ _5"></span>性<span class="_ _5"></span>,<span class="_ _5"></span>也<span class="_ _5"></span>可<span class="_ _5"></span>以<span class="_ _5"></span>通<span class="_ _8"></span>过<span class="_ _6"> </span><span class="ff2 sc1">setsockopt()<span class="_ _5"></span></span>函<span class="_ _5"></span>数<span class="_ _5"></span>设<span class="_ _5"></span><span class="ff4">置<span class="_ _5"></span></span>套<span class="_ _5"></span>接</div><div class="t m0 x2 h4 y4e ff1 fs1 fc0 sc0 ls0 ws0">口的属性。</div><div class="t m0 x2 h3 y4f ff2 fs0 fc0 sc1 ls0 ws0">2.<span class="_ _23"> </span><span class="ff1 sc0">基本的<span class="_ _0"> </span></span>W<span class="_ _9"></span>indows Sockets <span class="_ _17"></span>API<span class="_ _0"> </span><span class="ff1 sc0">编程</span></div><div class="t m0 x4 h5 y50 ff5 fs1 fc0 sc0 ls0 ws0"><span class="_ _d"> </span><span class="ff1">需要在程序中<span class="ff4">添</span>加下面的包<span class="ff4">含语句</span>:<span class="ff2 sc1">#include<winsock2.h></span></span></div><div class="t m0 x4 h5 y51 ff5 fs1 fc0 sc1 ls0 ws0"><span class="_ _d"> </span><span class="ff1 sc0">使用<span class="_ _3"> </span></span><span class="ff2">vc++<span class="ff1 sc0">编<span class="ff4">译</span>时需<span class="ff4">添</span>加编<span class="ff4">译链</span>接<span class="ff4">依赖</span>项<span class="_ _1"> </span></span>ws2_32.lib<span class="_ _1"> </span><span class="ff1 sc0">库</span></span></div><div class="t m0 x4 h5 y52 ff5 fs1 fc0 sc1 ls0 ws0"><span class="_ _d"> </span><span class="ff1 sc0">协议<span class="ff4">寻</span>址</span></div><div class="t m0 x2 h5 y53 ff3 fs1 fc0 sc1 ls0 ws0"> <span class="ff1">在<span class="_ _3"> </span></span>winsock<span class="_ _1"> </span><span class="ff1">中,应用程序通过<span class="_ _1"> </span></span>sockaddr_in <span class="ff1">结<span class="ff4">构</span>来<span class="ff4">指</span>定<span class="_ _3"> </span></span>IP<span class="_"> </span><span class="ff1">地址和服务端口信息</span></div><div class="t m0 x2 h6 y54 ff3 fs1 fc0 sc1 ls0 ws0">sockaddr_in internetAddr;</div><div class="t m0 x2 h6 y55 ff3 fs1 fc0 sc1 ls0 ws0">int nPortID=5320;</div><div class="t m0 x2 h6 y56 ff3 fs1 fc0 sc1 ls0 ws0">internetAddr<span class="_ _2"></span>.sin_family=AF_INET<span class="_ _2"></span>;</div><div class="t m0 x2 h6 y57 ff3 fs1 fc0 sc1 ls0 ws0">internet.sin_addr<span class="_ _2"></span>.s_addr=inet_addr(“202.202.42.88”); //INADDR_ANY<span class="_ _9"></span> </div><div class="t m0 x2 h6 y58 ff3 fs1 fc0 sc1 ls0 ws0">internet.sin_port=htons(nPortID);</div><div class="t m0 x2 h5 y59 ff3 fs1 fc0 sc1 ls0 ws0">ip<span class="_ _3"> </span><span class="ff1">地址不容<span class="ff4">易记忆</span>,<span class="ff4">还</span>提供了<span class="ff4">许多</span>地址和名称解析函数如<span class="_ _1"> </span></span>gethostbyname,gethostbyaddr<span class="_ _1"> </span><span class="ff1">等。</span></div><div class="t m0 x2 h4 y5a ff2 fs1 fc0 sc1 ls0 ws0">2.1<span class="_ _1"> </span><span class="ff1 sc0">常用函数</span></div><div class="t m0 x2 h5 y5b ff3 fs1 fc0 sc1 ls0 ws0">1<span class="ff1">)</span>WSAStartup <span class="ff4">调<span class="ff1">用<span class="_ _1"> </span></span></span>windows Socket DLL</div><div class="t m0 x2 h4 y5c ff1 fs1 fc0 sc1 ls0 ws0">函数原型<span class="ff3"> int WSAStartup(</span></div><div class="t m0 x2 h5 y5d ff3 fs1 fc0 sc1 ls0 ws0"> WORD wV<span class="_ _24"></span>ersionRequested, //<span class="ff1">应用程序要求的<span class="_ _1"> </span></span>sockets<span class="_ _1"> </span><span class="ff4">版<span class="ff1">本</span></span></div></div></div><div class="pi" data-data='{"ctm":[1.611850,0.000000,0.000000,1.611850,0.000000,0.000000]}'></div></div>
<div id="pf5" class="pf w0 h0" data-page-no="5"><div class="pc pc5 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/622b326e81ded46b7f2f204d/bg5.jpg"><div class="c x0 y1 w2 h2"><div class="t m0 x2 h5 y2e ff3 fs1 fc0 sc1 ls0 ws0"> LPWSADA<span class="_ _24"></span>T<span class="_ _17"></span>A<span class="_ _2"></span> lpWSAData //<span class="_ _5"></span><span class="ff4">指向<span class="ff1">数</span>据<span class="ff1">结</span>构<span class="_ _3"> </span></span>WSDA<span class="_ _24"></span>T<span class="_ _2"></span>A<span class="_ _3"> </span><span class="ff1">的<span class="ff4">指</span>针,</span></div><div class="t m0 x2 h5 y2f ff3 fs1 fc0 sc1 ls0 ws0"> //<span class="ff4">得<span class="ff1">到<span class="_ _1"> </span></span></span>windows Socket<span class="_ _3"> </span><span class="ff1">的<span class="ff4">具体</span>信息</span></div><div class="t m0 xb h5 y3 ff1 fs1 fc0 sc1 ls0 ws0">)<span class="ff4">;</span></div><div class="t m0 x2 h4 y4 ff3 fs1 fc0 sc1 ls0 ws0">WSDA<span class="_ _24"></span>T<span class="_ _17"></span>A<span class="_ _1"> </span><span class="ff1">定义如下:</span></div><div class="t m0 x2 h6 y5e ff3 fs1 fc0 sc1 ls0 ws0">typedef struct WSADat<span class="_ _9"></span>a {</div><div class="t m0 x2 h6 y5f ff3 fs1 fc0 sc1 ls0 ws0"> WORD wV<span class="_ _24"></span>ersion;</div><div class="t m0 x2 h6 y60 ff3 fs1 fc0 sc1 ls0 ws0"> WORD wHighV<span class="_ _24"></span>ersion;</div><div class="t m0 x2 h6 y61 ff3 fs1 fc0 sc1 ls0 ws0">#ifdef _WIN64</div><div class="t m0 x2 h6 y62 ff3 fs1 fc0 sc1 ls0 ws0"> unsigned short iMaxSockets;</div><div class="t m0 x2 h6 y63 ff3 fs1 fc0 sc1 ls0 ws0"> unsigned short iMaxUdpDg;</div><div class="t m0 x2 h6 y64 ff3 fs1 fc0 sc1 ls0 ws0"> char F<span class="_ _17"></span>AR * lpV<span class="_ _24"></span>endorInfo;</div><div class="t m0 x2 h6 y65 ff3 fs1 fc0 sc1 ls0 ws0"> char szDescription[WSADESCRIPTION_LEN+1];</div><div class="t m0 x2 h6 y66 ff3 fs1 fc0 sc1 ls0 ws0"> char szSystemStatus[WSASYS_ST<span class="_ _17"></span>A<span class="_ _24"></span>TUS_LEN+1];</div><div class="t m0 x2 h6 y67 ff3 fs1 fc0 sc1 ls0 ws0">#else</div><div class="t m0 x2 h6 y68 ff3 fs1 fc0 sc1 ls0 ws0"> char szDescription[WSADESCRIPTION_LEN+1];</div><div class="t m0 x2 h6 y69 ff3 fs1 fc0 sc1 ls0 ws0"> char szSystemStatus[WSASYS_ST<span class="_ _17"></span>A<span class="_ _24"></span>TUS_LEN+1];</div><div class="t m0 x2 h6 y6a ff3 fs1 fc0 sc1 ls0 ws0"> unsigned short iMaxSockets;</div><div class="t m0 x2 h6 y6b ff3 fs1 fc0 sc1 ls0 ws0"> unsigned short iMaxUdpDg;</div><div class="t m0 x2 h6 y6c ff3 fs1 fc0 sc1 ls0 ws0"> char F<span class="_ _17"></span>AR * lpV<span class="_ _24"></span>endorInfo;</div><div class="t m0 x2 h6 y6d ff3 fs1 fc0 sc1 ls0 ws0">#endif</div><div class="t m0 x2 h6 y6e ff3 fs1 fc0 sc1 ls0 ws0">} WSADA<span class="_ _24"></span>T<span class="_ _17"></span>A, F<span class="_ _17"></span>AR * LPWSADA<span class="_ _24"></span>T<span class="_ _17"></span>A;</div><div class="t m0 x2 h5 y16 ff3 fs1 fc0 sc1 ls0 ws0">2<span class="ff1">)</span>WSACleanup <span class="ff1">结<span class="ff4">束</span>对<span class="_ _3"> </span></span>Windows Sock<span class="_ _9"></span>ets DLL<span class="_ _1"> </span><span class="ff1">的<span class="ff4">调</span>用</span></div><div class="t m0 x2 h4 y17 ff1 fs1 fc0 sc1 ls0 ws0">函数原型:<span class="ff3">int WSACleanup(void);</span></div><div class="t m0 x2 h5 y18 ff3 fs1 fc0 sc1 ls0 ws0">3)socket <span class="ff1">用于<span class="ff4">建立<span class="_ _3"> </span></span></span>Socke<span class="_ _5"></span>ts<span class="ff1">。</span></div><div class="t m0 x2 h4 y19 ff1 fs1 fc0 sc1 ls0 ws0">函数原型:<span class="ff3">SOCKET socket(</span></div><div class="t m0 x2 h5 y1a ff3 fs1 fc0 sc1 ls0 ws0"> int af, //<span class="ff1">地址<span class="ff4">族</span>,一般是<span class="_ _3"> </span></span>AF_IN<span class="_ _5"></span>ET</div><div class="t m0 x2 h4 y1b ff3 fs1 fc0 sc1 ls0 ws0"> int type , //socket<span class="_ _3"> </span><span class="ff1">类型,</span>SOCK_<span class="_ _5"></span>STREAM<span class="_ _3"> </span><span class="ff1">或<span class="_ _1"> </span></span>SOCK_DGRAM</div><div class="t m0 x2 h5 y1c ff3 fs1 fc0 sc1 ls0 ws0"> int protocol //<span class="ff1">协议类型,通常<span class="ff4">取值</span></span> 0</div><div class="t m0 xc h6 y6f ff3 fs1 fc0 sc1 ls0 ws0">); </div><div class="t m0 x2 h5 y1e ff3 fs1 fc0 sc1 ls0 ws0">4<span class="ff1">)</span>closesocket <span class="ff4">关闭<span class="ff1">套接字</span></span></div><div class="t m0 x2 h4 y2b ff1 fs1 fc0 sc1 ls0 ws0">函数原型:<span class="ff3">int closesocket(</span></div><div class="t m0 xd h5 y2c ff3 fs1 fc0 sc1 ls0 ws0">SOCKET s<span class="_ _9"></span> //<span class="ff1">要<span class="ff4">关闭</span>的套接字</span></div><div class="t m0 xd h6 y70 ff3 fs1 fc0 sc1 ls0 ws0">); </div><div class="t m0 x2 h5 y20 ff3 fs1 fc0 sc1 ls0 ws0">5<span class="ff1">)</span>bind <span class="ff1">将一个本地地址和一个<span class="_ _1"> </span></span>SOCKET<span class="_ _3"> </span><span class="ff4">描述<span class="ff1">字连接</span>起<span class="ff1">来</span></span></div><div class="t m0 x2 h4 y21 ff1 fs1 fc0 sc1 ls0 ws0">函数原型:<span class="ff3">int bind(</span></div><div class="t m0 x2 h5 y22 ff3 fs1 fc0 sc1 ls0 ws0"> SOCKET s, //<span class="ff1">要<span class="ff4">绑</span>定的套接字</span></div><div class="t m0 x2 h5 y23 ff3 fs1 fc0 sc1 ls0 ws0"> const struct sockaddr F<span class="_ _17"></span>AR* name, //<span class="_ _5"></span><span class="ff4">指向<span class="_ _3"> </span></span>SOCKADDR<span class="_ _1"> </span><span class="ff1">结<span class="ff4">构</span>的地址</span></div><div class="t m0 x2 h5 y24 ff3 fs1 fc0 sc1 ls0 ws0"> int namelen //<span class="ff1">地址结<span class="ff4">构</span>的<span class="_ _1"> </span></span>sizeof</div><div class="t m0 x2 h6 y71 ff3 fs1 fc0 sc1 ls0 ws0"> )</div><div class="t m0 x2 h5 y26 ff3 fs1 fc0 sc1 ls0 ws0">Tcp/ip SOCKADDR<span class="_ _1"> </span><span class="ff1">结<span class="ff4">构</span></span></div><div class="t m0 x2 h6 y72 ff3 fs1 fc0 sc1 ls0 ws0">struct sockaddr{</div><div class="t m0 x2 h6 y73 ff3 fs1 fc0 sc1 ls0 ws0"> unsigned short sa_family;</div><div class="t m0 x4 h6 y74 ff3 fs1 fc0 sc1 ls0 ws0">char sa_data[4];</div><div class="t m0 x3 h6 y75 ff3 fs1 fc0 sc1 ls0 ws0">};</div></div></div><div class="pi" data-data='{"ctm":[1.611850,0.000000,0.000000,1.611850,0.000000,0.000000]}'></div></div>