﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-北飞-文章分类-linux</title><link>http://www.cppblog.com/xieyang0827/category/14022.html</link><description>努力成为大牛</description><language>zh-cn</language><lastBuildDate>Tue, 27 Jul 2010 06:41:09 GMT</lastBuildDate><pubDate>Tue, 27 Jul 2010 06:41:09 GMT</pubDate><ttl>60</ttl><item><title>网络编程学习系列二 TCP与UDP</title><link>http://www.cppblog.com/xieyang0827/articles/121251.html</link><dc:creator>北飞</dc:creator><author>北飞</author><pubDate>Sun, 25 Jul 2010 09:34:00 GMT</pubDate><guid>http://www.cppblog.com/xieyang0827/articles/121251.html</guid><wfw:comment>http://www.cppblog.com/xieyang0827/comments/121251.html</wfw:comment><comments>http://www.cppblog.com/xieyang0827/articles/121251.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xieyang0827/comments/commentRss/121251.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xieyang0827/services/trackbacks/121251.html</trackback:ping><description><![CDATA[&nbsp;
<p><span>目录：</span></p>
<p><span>&nbsp;</span><span>什么是</span><span>TCP</span><span>套接字</span><span>?</span></p>
<p><span>&nbsp;</span><span>什么是</span><span>UCP</span><span>套接字？</span></p>
<p><span>&nbsp;</span><span>什么时候，怎么选择？</span></p>
<p><span>在上节讲到我们会创建一个网络套接字，一般的套接字分为</span><span>TCP</span><span>类型和</span><span>UDP</span><span>类型，究竟这两种套接字有什么不同呢，还有就是什么时候应该选择</span><span>TCP</span><span>套接字，什么时候应该选择</span><span>UDP</span><span>套接字呢。</span></p>
<p><span>一</span> <span>什么是</span><span>TCP</span><span>套接字</span><span>?</span></p>
<p><span><span>&nbsp;&nbsp; </span></span><span>从计算机网络书上我们可以学到</span><span>TCP</span><span>的特性，</span><span>TCP</span><span>是一种提供面向连接，可靠的，基于字节流的运输层通信协议，它利用诸如超时重传，拥塞控制，丢弃重复包等策略来保证</span><span>TCP</span><span>服务的可靠性。采用</span><span>TCP</span><span>类型的套接字要求在交换数据之前，需要在本地套接字和远端套接字建立连接</span><span>(connect)</span><span>，等连接建立后双方的通信就可以开始了。因为双方已经建立连接，所以在会话中病不需要包含有关地址信息，双方的连接本身就包含着特点的源和目的地。</span></p>
<p><span><span>&nbsp;&nbsp; </span></span><span>利用</span><span>TCP</span><span>套接字进行通信时要注意一点，我们的应用程序并不会意识到报文的边界，因为套接字提供的是字节流服务，所以我们在接受对方的数据时，一次读取可能并不会返回对方发送的所有数据，这可能需要多次读取才能实现。在一般的实现中，会在报文格式的开始部门设置我们发送消息的长度，通过这个数字我们就可以了解还有多少数据没有接受到。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>还是举美眉和帅哥的例子，</span><span>TCP</span><span>套接字犹如帅哥主动打电话美眉，双方一旦建立连接后就可以不停的交谈，在交谈的过程中，美眉有那句话没有听清可以要求帅哥重复一次。美眉在开始就会听帅哥不停的唠叨，她不知道什么时候能够停止，除非帅哥一开始就告诉她：我只说一句话。当美眉听完这一句话后就可以不听了，因为我只听你一句话。</span></p>
<p><span>二</span> <span>什么是</span><span>UCP</span><span>套接字</span><span>?</span></p>
<p><span><span>&nbsp;&nbsp; </span>UDP</span><span>是一种无连接的运输层协议，提供面向事务的简单的不可靠信息传送服务，也就是当报文发送后，发送方并不保证报文一定会让对方收到。利用</span><span>UDP</span><span>套接字进行通信时，每次双方需要在消息中添加对方的地址，这样消息就会按照地址进行传送。</span></p>
<p><span><span>&nbsp;&nbsp; </span>UDP</span><span>套接字并不会像</span><span>TCP</span><span>套接字那样需要注意报文的边界，每个消息都是单独的个体，这个消息可能会丢失，也可能并不会按顺序接受。</span></p>
<p><span><span>&nbsp;&nbsp; </span></span><span>再拿美眉和帅哥的例子进行讲解吧，帅哥决定写信到对面的美眉，信上会表明对方的地址，他可能会写好几封信分别寄给对方，而美眉有可能有的信没有收到，更有可能收到的信并不是按照帅哥邮寄的顺序。</span></p>
<p><span>三</span> <span>什么时候，怎么选择</span></p>
<p><span><span>&nbsp;&nbsp; </span></span><span>由于</span><span>TCP</span><span>套接字和</span><span>UDP</span><span>套接字之间存在很大的差异，我们在选择的时候需要评估一下自己到底想要什么样的服务？</span><span>TCP</span><span>套接字会在建立连接有消耗，但在建立连接后可以可靠地进行数据传输，所以它适合有大数据量和对信息准确性高的传输。而</span><span>UCP</span><span>套接字则会会以消息投递的方式进行，这样在选择时，我们在针对某些点击服务或是对准确性要求不高的服务时可以选择</span><span>UDP</span><span>套接字。</span></p><img src ="http://www.cppblog.com/xieyang0827/aggbug/121251.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xieyang0827/" target="_blank">北飞</a> 2010-07-25 17:34 <a href="http://www.cppblog.com/xieyang0827/articles/121251.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网络编程学习系列一 套接字和客户端服务器模式</title><link>http://www.cppblog.com/xieyang0827/articles/121202.html</link><dc:creator>北飞</dc:creator><author>北飞</author><pubDate>Sat, 24 Jul 2010 15:03:00 GMT</pubDate><guid>http://www.cppblog.com/xieyang0827/articles/121202.html</guid><wfw:comment>http://www.cppblog.com/xieyang0827/comments/121202.html</wfw:comment><comments>http://www.cppblog.com/xieyang0827/articles/121202.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xieyang0827/comments/commentRss/121202.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xieyang0827/services/trackbacks/121202.html</trackback:ping><description><![CDATA[&nbsp;
<p><span>目录：</span></p>
<p><span>1.</span><span>什么是套接字？</span></p>
<p><span>2.</span><span>如何创建套接字？</span></p>
<p><span>3.</span><span>如何创建简单的服务器？</span></p>
<p><span>4.</span><span>如何创建简单的客户端？</span></p>
<p><span>一</span> <span>什么是套接字</span></p>
<p><span>&nbsp;</span><span>很多教材中会讲解什么是套接字，这里我讲一下我的理解。我们想和另一个大楼的某个房间的美眉建立联系，可选的方案是知道对方的电话直接呼叫，另外就是利用对方的地址</span><span>(</span><span>大楼和房间</span><span>)</span><span>写信给她，这个就是基本的通信。其实这个过程和利用套接字建立联系是有很大相似的。我们知道</span><span>IP</span><span>可以标记一台主机，而端口则是标记具体的服务，套接字是主机对面服务接口的抽象，它屏蔽了内部的具体实现，我们可以利用它与另一个进程</span><span>(</span><span>不管是否在一台主机上</span><span>)</span><span>建立通信。</span></p>
<p><span>二</span> <span>如何建立套接字</span></p>
<p><span><span>&nbsp;&nbsp; </span></span><span>不管是</span><span>linux</span><span>还是</span><span>windows</span><span>都提供了一系列的</span><span>socket</span><span>函数，而套接字可以</span><span>socket</span><span>创建，函数的原型为</span><span>int socket(int domain,int type,int protocal)</span><span>，</span><span>domain</span><span>一般会取</span><span>AF_INET</span><span>，这表示采用因特网域，</span><span>type</span><span>类型一般会取</span><span>SOCK_STREAM</span><span>和</span><span>SOCK_DGRAM</span><span>两种类型，分别对应着字节流和数据报两种类型。</span></p>
<p><span>三</span> <span>如何创建简单的服务端</span></p>
<p><span><span>&nbsp;&nbsp; </span></span><span>服务端犹如那个美眉，我们要想联系知道她的地址。一般开放的美眉会向开开放自己的地址，等着帅哥过来主动联系，美眉为了隐藏自己会用自己的小号与帅哥联系，而且可能还要保存着帅哥的信息以便以后可以继续联系。服务端会按照以下的方式进行创建：</span></p>
<p><span><span>(1)<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>创建套接字</span><span> socket</span></p>
<p><span><span>(2)<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>这个套接字命名，即绑定地址：</span><span>sockaddr_in<span>&nbsp;&nbsp; </span>bind</span></p>
<p><span><span>(3)<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>建立等待客户端连接的队列，设置套接字为监听状态</span><span> listen</span></p>
<p><span><span>(4)<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>接受客户端的连接</span><span> accept</span></p>
<p><span><span>(5)<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>关闭连接</span><span>&nbsp;close </span></p>
<p><span>备注：</span><span>accept</span><span>会返回一个套接字，服务端会利用这个套接字与客户端进行联系。</span></p>
<p><span>等走完以上几个步骤后，一个简单的服务端程序就可以运行了啊，我们帅哥</span><span>(</span><span>客户端</span><span>)</span><span>就可以主动的联系我们的美眉了啊。</span></p>
<p><span>四</span> <span>如何创建简单的客户端</span></p>
<p><span>&nbsp;</span><span>客户端就是那个要主动联系美眉的角色，没有什么内涵，也不需要添加太多的功能，客户端可以按照一下流程就可以搞定：</span></p>
<p><span><span>(1)<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>创建套接字</span><span> socket</span></p>
<p><span><span>(2)<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>连接服务端</span><span> connect</span></p>
<p><span><span>(3)<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>关闭连接</span><span> close</span></p>
<p><span>通过以上流程，客户端就可以搞定了啊，客户端和服务端两者就可以畅快的通信了啊。</span></p>
<p><span><span>&nbsp;&nbsp; </span></span></p>
<img src ="http://www.cppblog.com/xieyang0827/aggbug/121202.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xieyang0827/" target="_blank">北飞</a> 2010-07-24 23:03 <a href="http://www.cppblog.com/xieyang0827/articles/121202.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>