﻿<?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++博客-milo-文章分类-网络编程</title><link>http://www.cppblog.com/milo/category/8782.html</link><description>c++</description><language>zh-cn</language><lastBuildDate>Wed, 12 Nov 2008 01:42:19 GMT</lastBuildDate><pubDate>Wed, 12 Nov 2008 01:42:19 GMT</pubDate><ttl>60</ttl><item><title>（转）Winsocket编程之套接字原理</title><link>http://www.cppblog.com/milo/articles/66511.html</link><dc:creator>milo</dc:creator><author>milo</author><pubDate>Mon, 10 Nov 2008 05:57:00 GMT</pubDate><guid>http://www.cppblog.com/milo/articles/66511.html</guid><wfw:comment>http://www.cppblog.com/milo/comments/66511.html</wfw:comment><comments>http://www.cppblog.com/milo/articles/66511.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/milo/comments/commentRss/66511.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/milo/services/trackbacks/66511.html</trackback:ping><description><![CDATA[
<span style="color: rgb(50, 52, 50); font-family: Verdana; font-size: 12px; "><strong><span style="font-size: 14px; line-height: 22px; "><span class="Apple-tab-span" style="white-space:pre">	</span>一、客户机/服务器 模型</span><br><br></strong>　　<span class="Apple-tab-span" style="white-space:pre">		</span>在TCP/IP网络中两个进程间的相互作用的主机模式是客户机/服务器模式(Client/Server model)。该模式的建立基于以下两点：1、非对等作用；2、通信完全是异步的。客户机/服务器模式在操作过程中采取的是主动请示方式：<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; list-style-type: none; padding-top: 10px; padding-right: 15px; padding-bottom: 8px; padding-left: 15px; font-size: 14px; line-height: 22px; ">　　首先服务器方要先启动，并根据请示提供相应服务：（过程如下）<br><br>　　1、打开一通信通道并告知本地主机，它愿意在某一个公认地址上接收客户请求。<br><br>　　2、等待客户请求到达该端口。<br><br>　　3、接收到重复服务请求，处理该请求并发送应答信号。<br><br>　　4、返回第二步，等待另一客户请求<br><br>　　5、关闭服务器。<br><br>　　客户方：<br><br>　　1、打开一通信通道，并连接到服务器所在主机的特定端口。<br><br>　　2、向服务器发送服务请求报文，等待并接收应答；继续提出请求&#8230;&#8230;<br><br>　　3、请求结束后关闭通信通道并终止。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; list-style-type: none; padding-top: 10px; padding-right: 15px; padding-bottom: 8px; padding-left: 15px; font-size: 14px; line-height: 22px; ">　　<strong>二、基本套接字</strong><br><br>　　为了更好说明套接字编程原理，给出几个基本的套接字，在以后的篇幅中会给出更详细的使用说明。<br><br>　　1、创建套接字——socket()<br><br>　　功能：使用前创建一个新的套接字<br><br>　　格式：SOCKET PASCAL FAR socket(int af,int type,int procotol);<br><br>　　参数：af: 通信发生的区域<br><br>　　type: 要建立的套接字类型<br><br>　　procotol: 使用的特定协议</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; list-style-type: none; padding-top: 10px; padding-right: 15px; padding-bottom: 8px; padding-left: 15px; font-size: 14px; line-height: 22px; ">　　2、指定本地地址——bind()<br><br>　　功能：将套接字地址与所创建的套接字号联系起来。<br><br>　　格式：int PASCAL FAR bind(SOCKET s,const struct sockaddr FAR * name,int namelen);<br><br>　　参数：s: 是由socket()调用返回的并且未作连接的套接字描述符（套接字号）。<br><br>　　其它：没有错误，bind()返回0，否则SOCKET_ERROR<br><br>　　地址结构说明：<br><br></p><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000; ">&#160;&#160;&#160;&#160;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&#160;sockaddr_in<br>&#160;&#160;&#160;&#160;{<br>&#160;&#160;&#160;&#160;<span class="Apple-tab-span" style="white-space:pre">	</span></span><span style="color: #0000FF; ">short</span><span style="color: #000000; ">&#160;sin_family;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">AF_INET</span><span style="color: #008000; "><br></span><span style="color: #000000; ">&#160;&#160;&#160;&#160;<span class="Apple-tab-span" style="white-space:pre">	</span>u_short&#160;sin_port;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">16位端口号，网络字节顺序</span><span style="color: #008000; "><br></span><span style="color: #000000; ">&#160;&#160;&#160;&#160;<span class="Apple-tab-span" style="white-space:pre">	</span></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&#160;in_addr&#160;sin_addr;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">32位IP地址，网络字节顺序</span><span style="color: #008000; "><br></span><span style="color: #000000; ">&#160;&#160;&#160;&#160;<span class="Apple-tab-span" style="white-space:pre">	</span></span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&#160;sin_zero[</span><span style="color: #000000; ">8</span><span style="color: #000000; ">];</span><span style="color: #008000; ">//</span><span style="color: #008000; ">保留</span><span style="color: #008000; "><br></span><span style="color: #000000; ">&#160;&#160;&#160;&#160;}</span></div><p>&#160;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; list-style-type: none; padding-top: 10px; padding-right: 15px; padding-bottom: 8px; padding-left: 15px; font-size: 14px; line-height: 22px; ">　　3、建立套接字连接——connect()和accept()<br><br>　　功能：共同完成连接工作<br><br>　　格式：</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; list-style-type: none; padding-top: 10px; padding-right: 15px; padding-bottom: 8px; padding-left: 15px; font-size: 14px; line-height: 22px; "></p><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000; ">&#160;&#160; &#160;&#160;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&#160;PASCAL&#160;FAR&#160;connect(SOCKET&#160;s,</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&#160;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&#160;sockaddr&#160;FAR&#160;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&#160;name,</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&#160;namelen);<br><br>　　SOCKET&#160;PASCAL&#160;FAR&#160;accept(SOCKET&#160;s,</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&#160;sockaddr&#160;FAR&#160;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&#160;name,</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&#160;FAR&#160;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&#160;addrlen);</span></div><br>　　参数：同上<p>&#160;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; list-style-type: none; padding-top: 10px; padding-right: 15px; padding-bottom: 8px; padding-left: 15px; font-size: 14px; line-height: 22px; ">　　4、监听连接——listen()<br><br>　　功能：用于面向连接服务器，表明它愿意接收连接。<br><br>　　格式：int PASCAL FAR listen(SOCKET s, int backlog);<br></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; list-style-type: none; padding-top: 10px; padding-right: 15px; padding-bottom: 8px; padding-left: 15px; font-size: 14px; line-height: 22px; ">　　5、数据传输——send()与recv()<br><br>　　功能：数据的发送与接收<br><br>　　格式：int PASCAL FAR send(SOCKET s,const char FAR * buf,int len,int flags);<br><br>　　int PASCAL FAR recv(SOCKET s,const char FAR * buf,int len,int flags);<br><br>　　参数：buf:指向存有传输数据的缓冲区的指针。&#160;<br><br>　　6、多路复用——select()<br><br>　　功能：用来检测一个或多个套接字状态。<br><br>　　格式：</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; list-style-type: none; padding-top: 10px; padding-right: 15px; padding-bottom: 8px; padding-left: 15px; font-size: 14px; line-height: 22px; "></p><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&#160;PASCAL&#160;FAR&#160;select(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&#160;nfds,fd_set&#160;FAR&#160;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&#160;readfds,fd_set&#160;FAR&#160;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&#160;writefds,&#160;<br>fd_set&#160;FAR&#160;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&#160;exceptfds,</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&#160;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&#160;timeval&#160;FAR&#160;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&#160;timeout);</span></div><br>　　参数：readfds:指向要做读检测的指针<br><br>　　　　　writefds:指向要做写检测的指针<br><br>　　　　　exceptfds:指向要检测是否出错的指针<br><br>　　　　　timeout:最大等待时间<p>&#160;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; list-style-type: none; padding-top: 10px; padding-right: 15px; padding-bottom: 8px; padding-left: 15px; font-size: 14px; line-height: 22px; ">　　7、关闭套接字——closesocket()<br><br>　　功能：关闭套接字s<br><br>　　格式：BOOL PASCAL FAR closesocket(SOCKET s);</p></span><img src ="http://www.cppblog.com/milo/aggbug/66511.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/milo/" target="_blank">milo</a> 2008-11-10 13:57 <a href="http://www.cppblog.com/milo/articles/66511.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）手把手教你玩转SOCKET模型之重叠I/O篇</title><link>http://www.cppblog.com/milo/articles/66501.html</link><dc:creator>milo</dc:creator><author>milo</author><pubDate>Mon, 10 Nov 2008 03:46:00 GMT</pubDate><guid>http://www.cppblog.com/milo/articles/66501.html</guid><wfw:comment>http://www.cppblog.com/milo/comments/66501.html</wfw:comment><comments>http://www.cppblog.com/milo/articles/66501.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/milo/comments/commentRss/66501.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/milo/services/trackbacks/66501.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &#160;&#8220;身为一个初学者，时常能体味到初学者入门的艰辛，所以总是想抽空作点什么来尽我所能的帮助那些需要帮助的人。我也希望大家能把自己的所学和他人一起分享，不要去鄙视别人索取时的贪婪，因为最应该被鄙视的是不肯付出时的吝啬。&#8221;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&...&nbsp;&nbsp;<a href='http://www.cppblog.com/milo/articles/66501.html'>阅读全文</a><img src ="http://www.cppblog.com/milo/aggbug/66501.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/milo/" target="_blank">milo</a> 2008-11-10 11:46 <a href="http://www.cppblog.com/milo/articles/66501.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>