﻿<?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++博客-再别流年的技术实验室</title><link>http://www.cppblog.com/lf426/</link><description>Game Design Using C++ and SDL</description><language>zh-cn</language><lastBuildDate>Mon, 22 Mar 2010 01:04:41 GMT</lastBuildDate><pubDate>Mon, 22 Mar 2010 01:04:41 GMT</pubDate><ttl>60</ttl><item><title>Linux socket 编程入门（一）TCP server 端：8、本章的完整源代码</title><link>http://www.cppblog.com/lf426/archive/2008/07/16/56281.html</link><dc:creator>lf426</dc:creator><author>lf426</author><pubDate>Wed, 16 Jul 2008 04:57:00 GMT</pubDate><guid>http://www.cppblog.com/lf426/archive/2008/07/16/56281.html</guid><wfw:comment>http://www.cppblog.com/lf426/comments/56281.html</wfw:comment><comments>http://www.cppblog.com/lf426/archive/2008/07/16/56281.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/lf426/comments/commentRss/56281.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lf426/services/trackbacks/56281.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000;">//</span><span style="color: #008000;">Filename:&nbsp;TcpServerClass.hpp</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>#ifndef&nbsp;TCPSERVERCLASS_HPP_INCLUDED<br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;TCPSERVERCLASS_HPP_INCLUDED</span><span style="color: #000000;"><br><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">unistd.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">iostream</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">sys</span><span style="color: #000000;">/</span><span style="color: #000000;">socket.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">arpa</span><span style="color: #000000;">/</span><span style="color: #000000;">inet.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;TcpServer<br>{<br></span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;listenSock;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;communicationSock;<br>&nbsp;&nbsp;&nbsp;&nbsp;sockaddr_in&nbsp;servAddr;<br>&nbsp;&nbsp;&nbsp;&nbsp;sockaddr_in&nbsp;clntAddr;<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;TcpServer(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;listen_port);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;isAccept();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;handleEcho();<br>};<br><br><br></span><span style="color: #0000ff;">#endif</span><span style="color: #000000;">&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;TCPSERVERCLASS_HPP_INCLUDED</span></div>
<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000;">//</span><span style="color: #008000;">Filename:&nbsp;TcpServerClass.cpp</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">TcpServerClass.hpp</span><span style="color: #000000;">"</span><span style="color: #000000;"><br><br>TcpServer::TcpServer(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;listen_port)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;(listenSock&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;socket(PF_INET,&nbsp;SOCK_STREAM,&nbsp;IPPROTO_TCP))&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">socket()&nbsp;failed</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;memset(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">servAddr,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(servAddr));<br>&nbsp;&nbsp;&nbsp;&nbsp;servAddr.sin_family&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;AF_INET;<br>&nbsp;&nbsp;&nbsp;&nbsp;servAddr.sin_addr.s_addr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;htonl(INADDR_ANY);<br>&nbsp;&nbsp;&nbsp;&nbsp;servAddr.sin_port&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;htons(listen_port);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;bind(listenSock,&nbsp;(sockaddr</span><span style="color: #000000;">*</span><span style="color: #000000;">)</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">servAddr,&nbsp;</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(servAddr))&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">bind()&nbsp;failed</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;listen(listenSock,&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">listen()&nbsp;failed</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br></span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;TcpServer::isAccept()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;clntAddrLen&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(clntAddr);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;(communicationSock&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;accept(listenSock,&nbsp;(sockaddr</span><span style="color: #000000;">*</span><span style="color: #000000;">)</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">clntAddr,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">clntAddrLen))&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Client(IP:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;inet_ntoa(clntAddr.sin_addr)&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;connected.\n</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;TcpServer::handleEcho()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;BUFFERSIZE&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">32</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;buffer[BUFFERSIZE];<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;recvMsgSize;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;goon&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(&nbsp;goon&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">&nbsp;)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;(recvMsgSize&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;recv(communicationSock,&nbsp;buffer,&nbsp;BUFFERSIZE,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">))&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">recv()&nbsp;failed</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;recvMsgSize&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;goon&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;send(communicationSock,&nbsp;buffer,&nbsp;recvMsgSize,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;recvMsgSize&nbsp;)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">send()&nbsp;failed</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;close(communicationSock);<br>}</span></div>
<br>演示程序：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000;">//</span><span style="color: #008000;">Filename:&nbsp;main.cpp<br></span><span style="color: #008000;">//</span><span style="color: #008000;">Tcp&nbsp;Server&nbsp;C++&nbsp;style,&nbsp;single&nbsp;work</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">iostream</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">TcpServerClass.hpp</span><span style="color: #000000;">"</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;echo_server(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;argc,&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;argv[]);<br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;argc,&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;argv[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;mainRtn&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mainRtn&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;echo_server(argc,&nbsp;argv);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;s&nbsp;)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(s);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_FAILURE);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;mainRtn;<br>}<br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;echo_server(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;argc,&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;argv[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;port;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;argc&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;port&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;atoi(argv[</span><span style="color: #000000;">1</span><span style="color: #000000;">]);<br>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;port&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">5000</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;TcpServer&nbsp;myServ(port);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">&nbsp;)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;myServ.isAccept()&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">&nbsp;)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myServ.handleEcho();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>}</span></div>
<br><br><img src ="http://www.cppblog.com/lf426/aggbug/56281.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lf426/" target="_blank">lf426</a> 2008-07-16 12:57 <a href="http://www.cppblog.com/lf426/archive/2008/07/16/56281.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux socket 编程入门（一）TCP server 端：7、接收与发送</title><link>http://www.cppblog.com/lf426/archive/2008/07/16/56279.html</link><dc:creator>lf426</dc:creator><author>lf426</author><pubDate>Wed, 16 Jul 2008 04:26:00 GMT</pubDate><guid>http://www.cppblog.com/lf426/archive/2008/07/16/56279.html</guid><wfw:comment>http://www.cppblog.com/lf426/comments/56279.html</wfw:comment><comments>http://www.cppblog.com/lf426/archive/2008/07/16/56279.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lf426/comments/commentRss/56279.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lf426/services/trackbacks/56279.html</trackback:ping><description><![CDATA[作者：龙飞<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在，我们通过accept()创建了新的socket，也就是我们类中的数据成员communicationSock，现在，我们就可以通过这个socket进行通讯了。<br><br>TCP通讯模型<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在介绍函数之前，我们应该了解一些事实。TCP的Server/Client模型类似这样：<br>ServApp——ServSock——Internet——ClntSock——ClntApp<br>当然，我们这里的socket指的就是用于&#8220;通讯&#8221;的socket。TCP的server端至少有两个socket，一个用于监听，一个用于通讯；TCP的server端可以只有一个socket，这个socket同时&#8220;插&#8221;在server的两个socket上。当然，插上listen socket的目的只是为了创建communication socket，创建完备后，listen是可以关闭的。但是，如果这样，其他的client就无法再连接上server了。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们这个模型，是client的socket插在server的communication socket上的示意。这两个socket，都拥有完整的本地地址信息以及远程计算机地址信息，所以，这两个socket以及之间的网络实际上形成了一条形式上&#8220;封闭&#8221;的管道。数据包只要从一端进来，就能知道出去的目的地，反之亦然。这正是TCP协议，数据流形式抽象化以及实现。因为不再需要指明&#8220;出处&#8221;和&#8220;去向&#8221;，对这样的socket（实际上是S/C上的socket对）的操作，就如同对本地文件描述符的操作一样。但是，尽管我们可以使用read()和write()，但是，为了完美的控制，我们最好使用recv()和send()。<br><br>recv()和send()<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<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;">&nbsp;send(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;socket,&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;msg,&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;msgLength,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;flags);<br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;recv(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;socket,&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;rcvBuffer,&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;bufferLength,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;flags);</span></div>
在Linux中的实现为：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">sys</span><span style="color: #000000;">/</span><span style="color: #000000;">socket.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;Send&nbsp;N&nbsp;bytes&nbsp;of&nbsp;BUF&nbsp;to&nbsp;socket&nbsp;FD.&nbsp;&nbsp;Returns&nbsp;the&nbsp;number&nbsp;sent&nbsp;or&nbsp;-1.<br><br>&nbsp;&nbsp;&nbsp;This&nbsp;function&nbsp;is&nbsp;a&nbsp;cancellation&nbsp;point&nbsp;and&nbsp;therefore&nbsp;not&nbsp;marked&nbsp;with<br>&nbsp;&nbsp;&nbsp;__THROW.&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">extern</span><span style="color: #000000;">&nbsp;ssize_t&nbsp;send&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;__fd,&nbsp;__const&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">__buf,&nbsp;size_t&nbsp;__n,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;__flags);<br><br></span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;Read&nbsp;N&nbsp;bytes&nbsp;into&nbsp;BUF&nbsp;from&nbsp;socket&nbsp;FD.<br>&nbsp;&nbsp;&nbsp;Returns&nbsp;the&nbsp;number&nbsp;read&nbsp;or&nbsp;-1&nbsp;for&nbsp;errors.<br><br>&nbsp;&nbsp;&nbsp;This&nbsp;function&nbsp;is&nbsp;a&nbsp;cancellation&nbsp;point&nbsp;and&nbsp;therefore&nbsp;not&nbsp;marked&nbsp;with<br>&nbsp;&nbsp;&nbsp;__THROW.&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">extern</span><span style="color: #000000;">&nbsp;ssize_t&nbsp;recv&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;__fd,&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">__buf,&nbsp;size_t&nbsp;__n,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;__flags);</span></div>
这两个函数的第一个参数是用于&#8220;通讯&#8221;的socket，第二个参数是发送或者接收数据的起始点指针，第三个参数是数据长度，第四个参数是控制符号（默认属性设置为0就可以了）。失败时候传回-1，否则传回实际发送或者接收数据的大小，返回0往往意味着连接断开了。<br><br>处理echo行为<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;TcpServer::handleEcho()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;BUFFERSIZE&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">32</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;buffer[BUFFERSIZE];<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;recvMsgSize;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;goon&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(&nbsp;goon&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">&nbsp;)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;(recvMsgSize&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;recv(communicationSock,&nbsp;buffer,&nbsp;BUFFERSIZE,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">))&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">recv()&nbsp;failed</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;recvMsgSize&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;goon&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;send(communicationSock,&nbsp;buffer,&nbsp;recvMsgSize,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;recvMsgSize&nbsp;)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">send()&nbsp;failed</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;close(communicationSock);<br>}</span></div>
本小节最后要讲的函数是close()，它包含在&lt;unistd.h&gt;中<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">unistd.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;Close&nbsp;the&nbsp;file&nbsp;descriptor&nbsp;FD.<br><br>&nbsp;&nbsp;&nbsp;This&nbsp;function&nbsp;is&nbsp;a&nbsp;cancellation&nbsp;point&nbsp;and&nbsp;therefore&nbsp;not&nbsp;marked&nbsp;with<br>&nbsp;&nbsp;&nbsp;__THROW.&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">extern</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;close&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;__fd);</span></div>
这个函数用于关闭一个文件描述符，自然，也就可以用于关闭socket。<br>下一小节是完整的源代码。默认的监听端口是5000。我们可以通过<br>$telnet 127.0.0.1 5000<br>验证在本机运行的echo server程序。<br> <img src ="http://www.cppblog.com/lf426/aggbug/56279.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lf426/" target="_blank">lf426</a> 2008-07-16 12:26 <a href="http://www.cppblog.com/lf426/archive/2008/07/16/56279.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux socket 编程入门（一）TCP server 端：6、创建“通讯 ”嵌套字</title><link>http://www.cppblog.com/lf426/archive/2008/07/15/56180.html</link><dc:creator>lf426</dc:creator><author>lf426</author><pubDate>Tue, 15 Jul 2008 05:04:00 GMT</pubDate><guid>http://www.cppblog.com/lf426/archive/2008/07/15/56180.html</guid><wfw:comment>http://www.cppblog.com/lf426/comments/56180.html</wfw:comment><comments>http://www.cppblog.com/lf426/archive/2008/07/15/56180.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lf426/comments/commentRss/56180.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lf426/services/trackbacks/56180.html</trackback:ping><description><![CDATA[作者：龙飞<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里的&#8220;通讯&#8221;加上了引号，是因为实际上所有的socket都有通讯的功能，只是在我们的例子中，之前那个socket只负责listen，而这个socket负责接受信息并echo回去。<br>&nbsp;我们现看看这个函数：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;TcpServer::isAccept()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;clntAddrLen&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(clntAddr);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;(communicationSock&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;accept(listenSock,&nbsp;(sockaddr</span><span style="color: #000000;">*</span><span style="color: #000000;">)</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">clntAddr,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">clntAddrLen))&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Client(IP:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;inet_ntoa(clntAddr.sin_addr)&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;connected.\n</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}</span></div>
<br>用accept()创建新的socket<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在我们的例子中，communicationSock实际上是用函数accept()创建的。<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<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;">&nbsp;accept(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;socket,&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;sockaddr</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;clientAddress,&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;addressLength);</span></div>
在Linux中的实现为：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;Await&nbsp;a&nbsp;connection&nbsp;on&nbsp;socket&nbsp;FD.<br>&nbsp;&nbsp;&nbsp;When&nbsp;a&nbsp;connection&nbsp;arrives,&nbsp;open&nbsp;a&nbsp;new&nbsp;socket&nbsp;to&nbsp;communicate&nbsp;with&nbsp;it,<br>&nbsp;&nbsp;&nbsp;set&nbsp;*ADDR&nbsp;(which&nbsp;is&nbsp;*ADDR_LEN&nbsp;bytes&nbsp;long)&nbsp;to&nbsp;the&nbsp;address&nbsp;of&nbsp;the&nbsp;connecting<br>&nbsp;&nbsp;&nbsp;peer&nbsp;and&nbsp;*ADDR_LEN&nbsp;to&nbsp;the&nbsp;address's&nbsp;actual&nbsp;length,&nbsp;and&nbsp;return&nbsp;the<br>&nbsp;&nbsp;&nbsp;new&nbsp;socket's&nbsp;descriptor,&nbsp;or&nbsp;-1&nbsp;for&nbsp;errors.<br><br>&nbsp;&nbsp;&nbsp;This&nbsp;function&nbsp;is&nbsp;a&nbsp;cancellation&nbsp;point&nbsp;and&nbsp;therefore&nbsp;not&nbsp;marked&nbsp;with<br>&nbsp;&nbsp;&nbsp;__THROW.&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">extern</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;accept&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;__fd,&nbsp;__SOCKADDR_ARG&nbsp;__addr,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socklen_t&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">__restrict&nbsp;__addr_len);</span></div>
这个函数实际上起着构造socket作用的仅仅只有第一个参数（另外还有一个不在这个函数内表现出来的因素，后面会讨论到），后面两个指针都有副作用，在socket创建后，会将客户端sockaddr的数据以及结构体的大小传回。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当程序调用accept()的时候，程序有可能就停下来等accept()的结果。这就是我们前一小节说到的block（阻塞）。这如同我们调用std::cin的时候系统会等待输入直到回车一样。accept()是一个有可能引起block的函数。请注意我说的是&#8220;有可能&#8221;，这是因为accept()的block与否实际上决定与第一个参数socket的属性。这个文件描述符如果是block的，accept()就block，否则就不block。默认情况下，socket的属性是&#8220;可读可写&#8221;，并且，是阻塞的。所以，我们不修改socket属性的时候，accept()是阻塞的。<br><br>accept()的另一面connect()<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; accept()只是在server端被动的等待，它所响应的，是client端connect()函数：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<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;">&nbsp;connect(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;socket,&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;sockaddr</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;foreignAddress,&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;addressLength);</span></div>
虽然我们这里不打算详细说明这个client端的函数，但是我们可以看出来，这个函数与之前我们介绍的bind()有几分相似，特别在Linux的实现中：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;Open&nbsp;a&nbsp;connection&nbsp;on&nbsp;socket&nbsp;FD&nbsp;to&nbsp;peer&nbsp;at&nbsp;ADDR&nbsp;(which&nbsp;LEN&nbsp;bytes&nbsp;long).<br>&nbsp;&nbsp;&nbsp;For&nbsp;connectionless&nbsp;socket&nbsp;types,&nbsp;just&nbsp;set&nbsp;the&nbsp;default&nbsp;address&nbsp;to&nbsp;send&nbsp;to<br>&nbsp;&nbsp;&nbsp;and&nbsp;the&nbsp;only&nbsp;address&nbsp;from&nbsp;which&nbsp;to&nbsp;accept&nbsp;transmissions.<br>&nbsp;&nbsp;&nbsp;Return&nbsp;0&nbsp;on&nbsp;success,&nbsp;-1&nbsp;for&nbsp;errors.<br><br>&nbsp;&nbsp;&nbsp;This&nbsp;function&nbsp;is&nbsp;a&nbsp;cancellation&nbsp;point&nbsp;and&nbsp;therefore&nbsp;not&nbsp;marked&nbsp;with<br>&nbsp;&nbsp;&nbsp;__THROW.&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">extern</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;connect&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;__fd,&nbsp;__CONST_SOCKADDR_ARG&nbsp;__addr,&nbsp;socklen_t&nbsp;__len);</span></div>
connect() 也使用了const的sockaddr，只不过是远程电脑上的而非bind()的本机。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; accept()在server端表面上是通过listen socket创建了新的socket，实际上，这种行为是在接受对方客户机程序中connect()函数的请求后发生的。综合起看，被创建的新socket实际上包含了listen socket的信息以及客户端connect()请求中所包含的信息——客户端的sockaddr地址。<br><br>新socket与sockaddr的关系<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; accept()创建的新socket（我们例子中的communicationSock，这里我们简单用newSock来带指）首先包含了listen socket的信息，所以，newSock具有本机sockaddr的信息；其次，因为它响应于client端connect()函数的请求，所以，它还包含了clinet端sockaddr的信息。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们说过，stream流形式的TCP协议实际上是建立起一个&#8220;可来可去&#8221;的通道。用于listen的通道，远程机的目标地址是不确定的；但是newSock却是有指定的本机地址和远程机地址，所以，这个socket，才是我们真正用于TCP&#8220;通讯&#8221;的socket。<br><br>inet_ntoa()<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">arpa</span><span style="color: #000000;">/</span><span style="color: #000000;">inet.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;Convert&nbsp;Internet&nbsp;number&nbsp;in&nbsp;IN&nbsp;to&nbsp;ASCII&nbsp;representation.&nbsp;&nbsp;The&nbsp;return&nbsp;value<br>&nbsp;&nbsp;&nbsp;is&nbsp;a&nbsp;pointer&nbsp;to&nbsp;an&nbsp;internal&nbsp;array&nbsp;containing&nbsp;the&nbsp;string.&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">extern</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">inet_ntoa&nbsp;(</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;in_addr&nbsp;__in)&nbsp;__THROW;</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于这个函数，我们可以作为一种，将IP地址，由in_addr结构转换为可读的ASCII形式的固定用法。<br><br> <img src ="http://www.cppblog.com/lf426/aggbug/56180.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lf426/" target="_blank">lf426</a> 2008-07-15 13:04 <a href="http://www.cppblog.com/lf426/archive/2008/07/15/56180.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux socket 编程入门（一）TCP server 端：5、创建监听嵌套字</title><link>http://www.cppblog.com/lf426/archive/2008/07/14/56092.html</link><dc:creator>lf426</dc:creator><author>lf426</author><pubDate>Mon, 14 Jul 2008 05:02:00 GMT</pubDate><guid>http://www.cppblog.com/lf426/archive/2008/07/14/56092.html</guid><wfw:comment>http://www.cppblog.com/lf426/comments/56092.html</wfw:comment><comments>http://www.cppblog.com/lf426/archive/2008/07/14/56092.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/lf426/comments/commentRss/56092.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lf426/services/trackbacks/56092.html</trackback:ping><description><![CDATA[作者：龙飞<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 前面一小节，我们已经写出了TcpServer的构造函数。这个函数的实际作用，就是创建了listen socket（监听嵌套字）。这一节，我们来具体分析这个创建的过程。<br><br>socket和sockaddr的创建是可以相互独立的<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在函数中，我们首先通过socket()系统调用创建了listenSock，然后通过为结构体赋值的方法具体定义了服务器端的sockaddr。（memset()函数的作用是把某个内存段的空间设定为某值，这里是清零。）其他的概念已经在前一小节讲完了。这里需要补充的是说明宏定义INADDR_ANY。这里的意思是使用本机所有可用的IP地址。当然，如果你机器绑定了多个IP地址，你也可以指定使用哪一个。<br><br>数据流简易模型（SOCK_STREAM）<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们的例子以电话做的比喻，实际上，socket stream模型不完全类似电话，它至少有以下这些特点：<br>1、一种持续性的连接。这点跟电话是类似的，也可以想象成流动着液体的水管。一旦断开，这种流动就会中断。<br>2、数据包的发送实际上是非连续的。这个世界上有什么事物是真正的线性连续的？呵呵，扯远了，这貌似一个哲学问题。我们仅仅需要知道的是，一个数据包不可能是无限大的，所以，总是一个小数据包一个小数据包这样的发送的。这一点，又有点像邮包的传递。这些数据包到达与否，到达的先后次序本身是无法保证的，即是说，是IP协议无法保证的。但是stream形式的TCP协议，在IP之上，做了一定到达和到达顺序的保证。<br>3、传送管道实际上是非封闭的。要不干嘛叫&#8220;网络&#8221;-_-!!!。我们之所以能保证数据包的&#8220;定点&#8221;传送，完全是依靠每个数据包都自带了目的地址信息。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由此可见，虽然socket和sockaddr可以分别创建，并无依赖关系。但是在实际使用的时候，一个socket至少会绑定一个本机的sockaddr，没有自己的&#8220;地址信息&#8221;，就不能接受到网络上的数据包（至少在TCP协议里面是这样的）。<br><br>socket与本机sockaddr的绑定<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有时候绑定是系统的任务，特别是当你不需要知道自己的IP地址和所使用的端口号的时候。但是，我们现在是建立服务器，你必须告诉客户端你的连接信息：IP和Port。所以，我们需要指明IP和Port，然后进行绑定。<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<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;">&nbsp;bind(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;socket,&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;sockaddr</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;localAddress,&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;addressLength);</span></div>
作为C++的程序员，也许你会觉得这个函数很不友好，它似乎更应该写成：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<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;">&nbsp;bind_cpp_style(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;socket,&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;sockaddr</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;localAddress);</span></div>
我们需要通过函数原型指明两点：<br>1、我们仅仅使用sockaddr结构的数据，但并不会对原有的数据进行修改；<br>2、我们使用的是完整的结构体，而不仅仅是这个结构体的指针。（很显然光用指针是无法说明结构体大小的）<br>幸运的是，在Linux的实现中，这个函数已经被写为：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">sys</span><span style="color: #000000;">/</span><span style="color: #000000;">socket.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;Give&nbsp;the&nbsp;socket&nbsp;FD&nbsp;the&nbsp;local&nbsp;address&nbsp;ADDR&nbsp;(which&nbsp;is&nbsp;LEN&nbsp;bytes&nbsp;long).&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">extern</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;bind&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;__fd,&nbsp;__CONST_SOCKADDR_ARG&nbsp;__addr,&nbsp;socklen_t&nbsp;__len)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__THROW;</span></div>
看到亲切的const，我们就知道这个指针带入是没有&#8220;副作用&#8221;的。<br><br>监听：listen()<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stream流模型形式上是一种&#8220;持续性&#8221;的连接，这就是要求信息的流动是&#8220;可来可去&#8221;的。也就是说，stream流的socket除了绑定本机的sockaddr，还应该拥有对方sockaddr的信息。在listen()中，这&#8220;对方的sockaddr&#8221;就可以不是某一个特定的sockaddr。实际上，listen socket的目的是准备被动的接受来自&#8220;所有&#8221;sockaddr的请求。所以，listen()反而就不能指定某个特定的sockaddr。<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<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;">&nbsp;listen(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;socket,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;queueLimit);</span></div>
其中第二个参数是等待队列的限制，一般设置在5-20。Linux中实现为：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">sys</span><span style="color: #000000;">/</span><span style="color: #000000;">socket.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;Prepare&nbsp;to&nbsp;accept&nbsp;connections&nbsp;on&nbsp;socket&nbsp;FD.<br>&nbsp;&nbsp;&nbsp;N&nbsp;connection&nbsp;requests&nbsp;will&nbsp;be&nbsp;queued&nbsp;before&nbsp;further&nbsp;requests&nbsp;are&nbsp;refused.<br>&nbsp;&nbsp;&nbsp;Returns&nbsp;0&nbsp;on&nbsp;success,&nbsp;-1&nbsp;for&nbsp;errors.&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">extern</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;listen&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;__fd,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;__n)&nbsp;__THROW;</span></div>
完成了这一步，回到我们的例子，就像是让你小弟在电话机前做好了接电话的准备工作。需要再次强调的是，这些行为仅仅是改变了socket的状态，实际上我想强调的是，为什么这些函数不会造成block（阻塞）的原因。（block的概念以后再解释）<br><br> <img src ="http://www.cppblog.com/lf426/aggbug/56092.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lf426/" target="_blank">lf426</a> 2008-07-14 13:02 <a href="http://www.cppblog.com/lf426/archive/2008/07/14/56092.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux socket 编程入门（一）TCP server 端：4、构造函数涉及的概念</title><link>http://www.cppblog.com/lf426/archive/2008/07/12/55956.html</link><dc:creator>lf426</dc:creator><author>lf426</author><pubDate>Sat, 12 Jul 2008 05:27:00 GMT</pubDate><guid>http://www.cppblog.com/lf426/archive/2008/07/12/55956.html</guid><wfw:comment>http://www.cppblog.com/lf426/comments/55956.html</wfw:comment><comments>http://www.cppblog.com/lf426/archive/2008/07/12/55956.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lf426/comments/commentRss/55956.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lf426/services/trackbacks/55956.html</trackback:ping><description><![CDATA[作者：龙飞<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 话题回到&#8220;黑社会办公室&#8221;的例子，讲概念已经扯得比较远了，不过，这一节我们还得讲概念，不过好在有些程序的例子。如果大家不想翻回去看TcpServer类的原型，我这里直接给出这个头文件的完整源代码：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000;">//</span><span style="color: #008000;">Filename:&nbsp;TcpServerClass.hpp</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>#ifndef&nbsp;TCPSERVERCLASS_HPP_INCLUDED<br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;TCPSERVERCLASS_HPP_INCLUDED</span><span style="color: #000000;"><br><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">unistd.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">iostream</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">sys</span><span style="color: #000000;">/</span><span style="color: #000000;">socket.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">arpa</span><span style="color: #000000;">/</span><span style="color: #000000;">inet.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;TcpServer<br>{<br></span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;listenSock;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;communicationSock;<br>&nbsp;&nbsp;&nbsp;&nbsp;sockaddr_in&nbsp;servAddr;<br>&nbsp;&nbsp;&nbsp;&nbsp;sockaddr_in&nbsp;clntAddr;<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;TcpServer(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;listen_port);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;isAccept();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;handleEcho();<br>};<br><br><br></span><span style="color: #0000ff;">#endif</span><span style="color: #000000;">&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;TCPSERVERCLASS_HPP_INCLUDED</span></div>
我们已经解释了为什么listenSock和communicationSock的类型是int，以及sockaddr_in是什么结构，现在来写这个类的构造函数：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">TcpServer::TcpServer(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;listen_port)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;(listenSock&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;socket(PF_INET,&nbsp;SOCK_STREAM,&nbsp;IPPROTO_TCP))&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">socket()&nbsp;failed</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;memset(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">servAddr,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(servAddr));<br>&nbsp;&nbsp;&nbsp;&nbsp;servAddr.sin_family&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;AF_INET;<br>&nbsp;&nbsp;&nbsp;&nbsp;servAddr.sin_addr.s_addr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;htonl(INADDR_ANY);<br>&nbsp;&nbsp;&nbsp;&nbsp;servAddr.sin_port&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;htons(listen_port);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;bind(listenSock,&nbsp;(sockaddr</span><span style="color: #000000;">*</span><span style="color: #000000;">)</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">servAddr,&nbsp;</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(servAddr))&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">bind()&nbsp;failed</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;listen(listenSock,&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">listen()&nbsp;failed</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}</span></div>
好，先看看程序培养一下感觉，我们还得说概念。<br><br>数据封装（Data Encapsutation）<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们前面说到了网络分层：链路——网络——传输——应用。数据从应用程序里诞生，传送到互联网上每一层都会进行一次封装：<br>Data&gt;&gt;Application&gt;&gt;TCP/UDP&gt;&gt;IP&gt;&gt;OS(Driver, Kernel &amp; Physical Address)<br>我们用socket重点描述的是协议，包括网络协议（IP）和传输协议（TCP/UDP）。<br>sockaddr重点描述的是地址，包括IP地址和TCP/UDP端口。<br><br>socket()函数<br><br>&nbsp;&nbsp;&nbsp; 我们从TcpServer::TcpServer()函数可以看到，socket和sockaddr的产生是可以相互独立的。socket()的函数原型是：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<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;">&nbsp;socket(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;protocolFamily,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;type,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;protocol);</span></div>
在Linux中的实现为：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">sys</span><span style="color: #000000;">/</span><span style="color: #000000;">socket.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;Create&nbsp;a&nbsp;new&nbsp;socket&nbsp;of&nbsp;type&nbsp;TYPE&nbsp;in&nbsp;domain&nbsp;DOMAIN,&nbsp;using<br>&nbsp;&nbsp;&nbsp;protocol&nbsp;PROTOCOL.&nbsp;&nbsp;If&nbsp;PROTOCOL&nbsp;is&nbsp;zero,&nbsp;one&nbsp;is&nbsp;chosen&nbsp;automatically.<br>&nbsp;&nbsp;&nbsp;Returns&nbsp;a&nbsp;file&nbsp;descriptor&nbsp;for&nbsp;the&nbsp;new&nbsp;socket,&nbsp;or&nbsp;-1&nbsp;for&nbsp;errors.&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">extern</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;socket&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;__domain,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;__type,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;__protocol)&nbsp;__THROW;</span></div>
第一个参数是协议簇（Linux里面叫作域，意思一样的），还是那句话，我们这篇教程用到的就仅仅是一个PF_INET（protocol family : internet），很多时候你会发现人们也经常在这里赋值为AF_INET，事实上，当前，AF_INET就是PF_INET的一个#define，但是，写成PF_INET从语义上会更加严谨。这也就是TCP/IP协议簇中的IP协议（Internet Protocol），网络层的协议。<br>后面两个参数定义传输层的协议。<br>第二个参数是传输层协议类型，我们教程里用到的宏，只有两个：SOCK_STREAM（数据流格式）和SOCK_DGRAM（数据报格式）；（具体是什么我们以后讨论）<br>第三个参数是具体的传输层协议。当赋值为0的时候，系统会根据传输层协议类型自动匹配和选择。事实上，当前，匹配SOCK_STREAM的就是TCP协议；而匹配SOCK_DGRAM就是UDP协议。所以，我们指定了第二个参数，第三个就可以简单的设置为0。不过，为了严谨，我们最好还是把具体协议写出来，比如，我们的例子中的TCP协议的宏名称：IPPROTO_TCP。<br><br>数据的&#8220;地址&#8221;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从数据封装的模型，我们可以看到数据是怎么从应用程序传递到互联网的。我们说过，数据的传送是通过socket进行的。但是socket只描述了协议类型。要让数据正确的传送到某个地方，必须添加那个地方的sockaddr地址；同样，要能接受网络上的数据，必须有自己的sockaddr地址。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可见，在网络上传送的数据包，是socket和sockaddr共同&#8220;染指&#8221;的结果。他们共同封装和指定了一个数据包的网络协议（IP）和IP地址，传输协议（TCP/UDP）和端口号。<br><br>网络字节和本机字节的相互转换<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sockaddr结构中的IP地址（sin_addr.s_addr）和端口号（sin_port）将被封装到网络上传送的数据包中，所以，它的结构形式需要保证是网络字节形式。我们这里用到的函数是htons()和htonl()，这些缩写的意思是：<br>h: host，主机（本机）<br>n: network，网络<br>to: to转换<br>s: short，16位（2字节，常用于端口号）<br>l: long, 32位（4字节，常用于IP地址）<br>&#8220;反过来&#8221;的函数也是存在的ntohs()和ntohl()。<br><br>动作与持续行为<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本节最后的一个概念可以跟计算机无关。作为动词，有些可以描述动作，有些是描述一重持续的行为状态的（就如同一般动词和be动词一样）。扯到C++来说，我们可以把持续行为封装到函数内部，只留出动作的接口。事实上，构造函数中的bind()和listen()就是这种描述持续状态的行为函数。<br><br> <img src ="http://www.cppblog.com/lf426/aggbug/55956.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lf426/" target="_blank">lf426</a> 2008-07-12 13:27 <a href="http://www.cppblog.com/lf426/archive/2008/07/12/55956.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux socket 编程入门（一）TCP server 端：3、sockaddr与sockaddr_in</title><link>http://www.cppblog.com/lf426/archive/2008/07/10/55800.html</link><dc:creator>lf426</dc:creator><author>lf426</author><pubDate>Thu, 10 Jul 2008 07:14:00 GMT</pubDate><guid>http://www.cppblog.com/lf426/archive/2008/07/10/55800.html</guid><wfw:comment>http://www.cppblog.com/lf426/comments/55800.html</wfw:comment><comments>http://www.cppblog.com/lf426/archive/2008/07/10/55800.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/lf426/comments/commentRss/55800.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lf426/services/trackbacks/55800.html</trackback:ping><description><![CDATA[作者：龙飞<br><br>收件人地址<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一家化妆品公司将一批新产品的样品，准备发给某学校某个班的女生们免费试用。通常情况下，这件邮包的地址上可以这么写：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">收件人：全体女生。<br>地址：A省B市C学校，X级Y班。</span></div>
但是，如果在描述地址的时候这样写呢：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">收件人：全体女生。<br>地址：请打电话xxxxxxxx，找他们学校一个叫Lucy的女生，然后把东西送到她的班上。</span></div>
这种文字是相当的诡异啊-_-!!!，但是并不等于就没有表述清楚邮包的去向和地址。事实上邮局看到这样的地址一定会发飙的，然而对于电脑，如果你的地址描述形式是他可以接受和执行的，他就会老老实实的按你的要求去做&#8230;&#8230;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所以，如何描述地址不是问题的关键，关键在于这样的表述是不是能够表述清楚一个地址。一种更加通用的表达形式可能是这样的：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">收件人：全体女生。<br>地址：</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">一种地址描述方式</span><span style="color: #000000;">&gt;</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 事实上，在socket的通用address描述结构sockaddr中正是用这样的方式来进行地址描述的：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;sockaddr<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">short</span><span style="color: #000000;">&nbsp;sa_family;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;sa_data[</span><span style="color: #000000;">14</span><span style="color: #000000;">];<br>};</span></div>
这是一个16字节大小的结构（2+14），sa_family可以认为是socket address family的缩写，也可能被简写成AF（Address Family），他就好像我们例子中那个&#8220;收件人：全体女生&#8221;一样，虽然事实上有很多AF的种类，但是我们这个教程中只用得上大名鼎鼎的internet家族AF_INET。另外的14字节是用来描述地址的。这是一种通用结构，事实上，当我们指定sa_family=AF_INET之后，sa_data的形式也就被固定了下来：最前端的2字节用于记录16位的端口，紧接着的4字节用于记录32位的IP地址，最后的8字节清空为零。这就是我们实际在构造sockaddr时候用到的结构sockaddr_in（意指socket address internet）：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;sockaddr_in<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">short</span><span style="color: #000000;">&nbsp;sin_family;<br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">short</span><span style="color: #000000;">&nbsp;sin_port;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;in_addr&nbsp;sin_addr;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;sin_zero[</span><span style="color: #000000;">8</span><span style="color: #000000;">];<br>};</span></div>
我想，sin_的意思，就是socket (address) internet吧，只不过把address省略掉了。sin_addr被定义成了一个结构，这个结构实际上就是：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;in_addr<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;s_addr;<br>};</span></div>
in_addr显然是internet address了，s_addr是什么意思呢？说实话我没猜出值得肯定的答案，也许就是socket address的意思吧，尽管跟更广义的sockaddr结构意思有所重复了。哎，这些都是历史原因，也许我是没有精力去考究了。<br><br>sockaddr和sockaddr_in在Linux中的实现<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 你可能还记得我之前说过，UNIX和Linux上的socket实现都是从BSD的socket实现演变过来的。事实上，socket这个词本来的意思，就是<span style="font-style: italic;">Berkeley Socket interface</span>的简单说法。Linux上的socket与原本的socket的应该是完全兼容的，不过发展到今天，在代码实现上可能有些小的差别。我们就吹毛求疵的来看看这些区别在什么地方。<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">bits</span><span style="color: #000000;">/</span><span style="color: #000000;">socket.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;Structure&nbsp;describing&nbsp;a&nbsp;generic&nbsp;socket&nbsp;address.&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;sockaddr<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;__SOCKADDR_COMMON&nbsp;(sa_);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;Common&nbsp;data:&nbsp;address&nbsp;family&nbsp;and&nbsp;length.&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;sa_data[</span><span style="color: #000000;">14</span><span style="color: #000000;">];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;Address&nbsp;data.&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;};<br><br></span><span style="color: #008000;">//</span><span style="color: #008000;">==============<br><br></span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;POSIX.1g&nbsp;specifies&nbsp;this&nbsp;type&nbsp;name&nbsp;for&nbsp;the&nbsp;`sa_family'&nbsp;member.&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>typedef&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">short</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;sa_family_t;<br><br></span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;This&nbsp;macro&nbsp;is&nbsp;used&nbsp;to&nbsp;declare&nbsp;the&nbsp;initial&nbsp;common&nbsp;members<br>&nbsp;&nbsp;&nbsp;of&nbsp;the&nbsp;data&nbsp;types&nbsp;used&nbsp;for&nbsp;socket&nbsp;addresses,&nbsp;`struct&nbsp;sockaddr',<br>&nbsp;&nbsp;&nbsp;`struct&nbsp;sockaddr_in',&nbsp;`struct&nbsp;sockaddr_un',&nbsp;etc.&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;__SOCKADDR_COMMON(sa_prefix)&nbsp;\</span><span style="color: #000000;"><br>&nbsp;&nbsp;sa_family_t&nbsp;sa_prefix##family<br><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;__SOCKADDR_COMMON_SIZE&nbsp;&nbsp;&nbsp;&nbsp;(sizeof&nbsp;(unsigned&nbsp;short&nbsp;int))</span></div>
可以看到，转了几次typedef，几次宏定义，实际效果是与标准socket一样的。<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">netinet</span><span style="color: #000000;">/</span><span style="color: #0000ff;">in</span><span style="color: #000000;">.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;Internet&nbsp;address.&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>typedef&nbsp;uint32_t&nbsp;in_addr_t;<br></span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;in_addr<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;in_addr_t&nbsp;s_addr;<br>&nbsp;&nbsp;};<br><br></span><span style="color: #008000;">//</span><span style="color: #008000;">=================</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br></span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;Structure&nbsp;describing&nbsp;an&nbsp;Internet&nbsp;socket&nbsp;address.&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;sockaddr_in<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;__SOCKADDR_COMMON&nbsp;(sin_);<br>&nbsp;&nbsp;&nbsp;&nbsp;in_port_t&nbsp;sin_port;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;Port&nbsp;number.&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;in_addr&nbsp;sin_addr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;Internet&nbsp;address.&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;Pad&nbsp;to&nbsp;size&nbsp;of&nbsp;`struct&nbsp;sockaddr'.&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;sin_zero[</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;sockaddr)&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__SOCKADDR_COMMON_SIZE&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">&nbsp;(in_port_t)&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;in_addr)];<br>&nbsp;&nbsp;};</span></div>
同样的，看起来挺复杂，实际上与标准socket的定义是一样的。<br><br>头文件依赖关系<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bits/socket.h&gt;是包含在&lt;sys/socket.h&gt;中的，&lt;netinet/in.h&gt;是包含在&lt;arpa/inet.h&gt;中的，实际上我们在程序中往往就是：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">sys</span><span style="color: #000000;">/</span><span style="color: #000000;">socket.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">arpa</span><span style="color: #000000;">/</span><span style="color: #000000;">inet.h</span><span style="color: #000000;">&gt;</span></div>
值得知道的是，ARPA是 Advanced research project agency（美国国防部高级研究计划暑）的所写，ARPANET是当今互联网的前身，所以我们就可以想象，为什么inet.h会在arpa目录下了。<br> <img src ="http://www.cppblog.com/lf426/aggbug/55800.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lf426/" target="_blank">lf426</a> 2008-07-10 15:14 <a href="http://www.cppblog.com/lf426/archive/2008/07/10/55800.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux socket 编程入门（一）TCP server 端：2、socket与文件描述符</title><link>http://www.cppblog.com/lf426/archive/2008/07/10/55771.html</link><dc:creator>lf426</dc:creator><author>lf426</author><pubDate>Wed, 09 Jul 2008 18:42:00 GMT</pubDate><guid>http://www.cppblog.com/lf426/archive/2008/07/10/55771.html</guid><wfw:comment>http://www.cppblog.com/lf426/comments/55771.html</wfw:comment><comments>http://www.cppblog.com/lf426/archive/2008/07/10/55771.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/lf426/comments/commentRss/55771.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lf426/services/trackbacks/55771.html</trackback:ping><description><![CDATA[作者：龙飞<br><br>UNIX中的一切事物都是文件（<em>everything</em> in Unix is a file!）<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当我在这篇教程中提到UNIX的时候，其意思专指符合UNIX标准的所谓&#8220;正统&#8221;UNIX的衍生系统（其实我就用来带指那些买了最初UNIX源代码的商业系统）操作系统和类似Linux，BSD这些类UNIX系统。如果某些要点是Linux特有的，或者因为本人孤陋寡闻暂时搞不清楚是Linux特有的还是UNIX通用的，我就会指明是Linux，甚至其发行版（我本人在写这篇教程的时候是以Debian GNU/Linux 4.0 etch为测试平台的）。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们学习UNIX的时候，恐怕听到的第一句话就是这句：UNIX中一切都是文件。这是UNIX的基本理念之一，也是一句很好的概括。比如，很多UNIX老鸟会举出个例子来，&#8220;你看，/dev/hdc是个文件，它实际上也是我的光盘&#8230;&#8230;&#8221;UNIX中的文件可以是：网络连接（network connection），输入输出（FIFO），管道（a pipe），终端（terminal），硬盘上的实际文件，或者其它任何东东。<br><br>文件与文件描述符（file &amp; file descriptor）<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 你可能对上一章中建模类中的int还记忆犹新。我们用int在描述socket，实际上，所有的文件描述符都是int，没错，用的是一个整数类型。如果你觉得这样让你很难接受，那么恭喜你，你跟我一样，也许是深中C++面向对象思想的毒了^^。因为是int，所以文件描述符不可能是C++概念中的对象，因为int无法发出行为，但是，这并不代表也不能接受一个动作哈。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PASCAL之父在批判面向对象思想教条的时候，曾经生动的举了个例子，&#8220;在OOP的概念中，绝对不应该接受a+b这种表达的， OOP对这个问题的表达应该是a.add(b)&#8221;。fd（file descriptor）可以作为接受动作的对象，但是本身却无法发出动作，这就如同一个只能做宾语不能做主语的名词，是个不完整的对象。但是，请别忘了Linux和socket本身是C语言的产物，我们必须接受在面向过程时代下的产物，正视历史——当然，这与我们自己再进行OOP的封装并不矛盾。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们应该记住3个已经打开的fd，0：标准输入（STDIN_FILENO）；1：标准输出（STDOUT_FILENO）；2：标准错误（STDERR_FILENO）。（以上宏定义在&lt;unistd.h&gt;中）一个最简单的使用fd的例子，就是使用&lt;unistd.h&gt;中的函数：write(1, "Hello, World!\n", 20);，在标准输出上显示&#8220;Hello, World!&#8221;。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另外一个需要注意的问题是，file和fd并非一定是一一对应的。当一个file被多个程序调用的时候，会生成相互独立的fd。这个概念可以类比于C++中的引用（eg: int&amp; rTmp = tmp;）。<br><br>socket与file descriptor<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文件是应用程序与系统（包括特定硬件设备）之间的桥梁，而文件描述符就是应用程序使用这个&#8220;桥梁&#8221;的接口。在需要的时候，应用程序会向系统申请一个文件，然后将文件的描述符返回供程序使用。返回socket的文件通常被创建在/tmp或者/usr/tmp中。我们实际上不用关心这些文件，仅仅能够利用返回的socket描述符就可以了。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 好了，说了这么多，实际上就解释了一个问题，&#8220;为什么socket的类型是int？&#8221; -_-!!!<br><br><img src ="http://www.cppblog.com/lf426/aggbug/55771.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lf426/" target="_blank">lf426</a> 2008-07-10 02:42 <a href="http://www.cppblog.com/lf426/archive/2008/07/10/55771.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux socket 编程入门（一）TCP server 端：1、建模</title><link>http://www.cppblog.com/lf426/archive/2008/07/08/55641.html</link><dc:creator>lf426</dc:creator><author>lf426</author><pubDate>Tue, 08 Jul 2008 07:42:00 GMT</pubDate><guid>http://www.cppblog.com/lf426/archive/2008/07/08/55641.html</guid><wfw:comment>http://www.cppblog.com/lf426/comments/55641.html</wfw:comment><comments>http://www.cppblog.com/lf426/archive/2008/07/08/55641.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/lf426/comments/commentRss/55641.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lf426/services/trackbacks/55641.html</trackback:ping><description><![CDATA[作者：龙飞<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 绝大部分关于socket编程的教程总是从socket的概念开始讲起的。要知道，socket的初衷是个庞大的体系，TCP/IP只是这个庞大体系下一个很小的子集，而我们真正能用上的更是这个子集中的一小部分：运输层（Host-to-Host Transport Layer）的TCP和UDP协议，以及使用这两个协议进行应用层（Application Layer）的开发。即使是socket的核心部分，网络层（Internet Layer）的IP协议，在编程的时候我们也很少会感觉到它的存在——因为已经被封装好了，我们唯一需要做的事情就是传入一个宏。第一节我想介绍的概念就这么多，当然，既然我们已经说了3个层了，我想最好还是把最后一个层也说出来，即所谓链路层（Network Access Layer），它包括了物理硬件和驱动程序。这四个层从底到高的顺序是：链路层－－网络层－－运输层－－应用层。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 好，说实话我们现在并不清楚所谓TCP到底是什么东东，不过我们知道这东东名气很大。或许你早就知道，另外一个声名狼藉建立在TCP协议基础上的应用程序，它曾经几乎是统治了一个时代，即使是今天，我们依然无法消除他的影响力的——恩，是的，就是telnet。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在这个教程中，我使用的环境是Debian GNU/Linux 4.0 etch。传说中的stable -_-!!!，恩，我是很保守的人。如果你不是自己DIY出来的系统，相信默认安装里面就应该有telnet（/usr/bin/telnet，要是没装就自己aptitude install吧）。telnet可以与所有遵循TCP协议的服务器端进行通讯。通常，socket编程总是Client/Server形式的，因为有了telnet，我们可以先不考虑client的程序，我们先写一个支持TCP协议的server端，然后用telnet作为client验证我们的程序就好了。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; server端的功能，我们也考虑一种最简单的反馈形式：echo。就如同你在终端输入echo 'Hello World'，回车后shell就会给你返回Hello World一样，我们的第一个TCP server就用以实现这个功能。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 什么样的模型适合描述这样的一种server呢？我相信，一个很2的例子会有助于我们记忆TCP server端的基本流程。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 想象你自己是个小大佬，坐办公室（什么样的黑社会做办公室啊？可能是讨债公司吧^^）你很土，只有一个小弟帮你接电话（因为你自己的号码是不敢对外公开的）。一次通讯的流程大概应该是这样的：小弟那里的总机电话响了；小弟接起电话；对方说是你女朋友A妹；小弟转达说，&#8220;老大，你马子电话&#8221;；你说，接过来；小弟把电话接给你；你和你女朋友聊天半小时；挂电话。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们来分析一下整个过程中的元素。先分析成员数据（请注意，这里开始用C++术语了）：你小弟（listenSock），你需要他来监听（listen，这是socket编程中的术语）电话；你自己（communicationSock），实际上打电话进行交流的是你自己；你的电话号码（servAddr），否则你女朋友怎么能找到你？你女朋友的电话号码（clntAddr），这个比喻有点牵强，因为事实上你接起电话，不需要知道对方的号码也可以通话（虽然事实上你应该是知道的，你不会取消了来电显示功能吧^^），但是，难道你是只接女朋友电话从来不打过去的牛人吗？这个过程中的行为（成员函数）：你小弟接电话并转接给你（isAccept()）；你自己的通话（handleEcho()）（这个行为确实比较土，只会乌鸦学舌的echo，呵呵）。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 简单的说，就是这些了。根据这个模型，我们可以很容易写出实现我们需要的echo功能的TCP server的类：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;TcpServer<br>{<br></span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;listenSock;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;communicationSock;<br>&nbsp;&nbsp;&nbsp;&nbsp;sockaddr_in&nbsp;servAddr;<br>&nbsp;&nbsp;&nbsp;&nbsp;sockaddr_in&nbsp;clntAddr;<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;TcpServer(</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> listen_port);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;isAccept();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;handleEcho();<br>};</span></div>
这里面有些简写，比如，sock实际上就是socket，addr就是address。serv和clnt我想你一定能猜到是server和client吧。还有一个socket中的结构体sockaddr_in，实际上就是这个意思：socket address internet（网络嵌套字地址），具体解说，请看下回分解。<br><br>  <img src ="http://www.cppblog.com/lf426/aggbug/55641.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lf426/" target="_blank">lf426</a> 2008-07-08 15:42 <a href="http://www.cppblog.com/lf426/archive/2008/07/08/55641.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SDL入门教程（十四）：1、网络，唠叨以及前言</title><link>http://www.cppblog.com/lf426/archive/2008/07/08/55582.html</link><dc:creator>lf426</dc:creator><author>lf426</author><pubDate>Mon, 07 Jul 2008 17:18:00 GMT</pubDate><guid>http://www.cppblog.com/lf426/archive/2008/07/08/55582.html</guid><wfw:comment>http://www.cppblog.com/lf426/comments/55582.html</wfw:comment><comments>http://www.cppblog.com/lf426/archive/2008/07/08/55582.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/lf426/comments/commentRss/55582.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lf426/services/trackbacks/55582.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这一次更新的间隔是很漫长的。之前的教程得到很多朋友的支持，让我感到责任的沉重。一般说来，技术博客的文章通常是自己的学习笔记，但是作为一份被期望&#8220;零起步&#8221;的教程，我更多时候感到这份东西不仅仅是为我自己写的。<span style="text-decoration: underline;"><br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SDL库作为主要为游戏开发提供简单易用的支持的API，相信很多朋友学习它的目的，也是跟我一样，希望能做出自己梦想中的游戏吧。作为游戏，我始终相信一个观点：（网络）游戏，是以电脑和网络为媒介，人与人之前的交流。游戏是我们营造&#8220;共同经历&#8221;的一种方式。作为交流的主要工具，网络起着决定性的作用。所以，本着对网络这一部分的高度重视，我对SDL_net寄予厚望。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 但是，现实是残酷的。我不可否认SDL_net已经对网络编程做了很好的封装，但是问题是，socket编程本身并不是件简单的事情。所以，实际上的情况是，仅仅靠学习SDL_net的函数库，也许我们根本不可能搞明白网络编程究竟是什么东东。必要的基础知识是必须学习的，我逐渐明白这一块我始终是不可能跳过去的。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 既然必须要补上这一块的知识，在具体的实现平台上，我们必须做出选择。经过均衡，我还是选择从BSD socket入手。这不仅仅是因为BSD上的socket实现是最早的TCP/IP实现，是业内的事实标准；也是因为Win32 API实在是不能引起我的好感。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当然，我们不可否认Windows有他先进的地方。至少，在socket编程方面，基于线程而非Linux以进程为基础的核心结构，可以更加有效的控制线程，并且线程的调度也更加均匀。在Linux下，无论是fork还是pthread，在我看来其实还是比不上WinThread的。但是，这反过来似乎也可以说明，在Linux下这两个东西几乎已经&#8220;够用&#8221;了。况且，从原理上去学习和了解；去了解传统和习惯形成的原因，是有助于我们理解这些通常在学术派的C/C++教科书上不会涉及到的知识：进程，线程，流程控制，通讯，甚至包括操作系统的基本原理。在我看来，这些知识是实际使用电脑编写程序完全无法回避的内容，是一个实践者必须掌握的知识。学术界对于程序的一般定义就是：数据＋算法。而在今天我们看来，多进程，多线程，socket通讯等等，已经完全改变了传统的编写程序的方式和思路。如果让我来定义，我觉得至少在前两者的基础上，还必须加上流程控制（包含了通讯的意思），这样才能算是当代计算机程序的完善定义。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第十四章的内容，估计会比较长，也会比较难。我会按照从socket到SDL_net的顺序去写，当然争取还是做到&#8220;零起步&#8221;的通俗易懂。这一部分，也会有一个单独的名字《Linux socket编程入门教程》。虽然是用Linux的名字，但是大家应该知道所有的Linux上TCP/IP的实现，甚至UNIX上的TCP/IP实现，基本上都是源于BSD的TCP/IP实现的，并且直到今天，这些实现都是相互源代码级兼容的。WinSock一般的说法也是源自socket，但是具体的函数会有不同。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 接下来的知识对于我来说也是个很大的挑战。因为涉及的面太广了。想全部学完是不现实的，我们必须根据自己的需要，从这些知识中寻找出我们需要的部分，恩，努力吧！<br><span style="text-decoration: underline;"></span><img src ="http://www.cppblog.com/lf426/aggbug/55582.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lf426/" target="_blank">lf426</a> 2008-07-08 01:18 <a href="http://www.cppblog.com/lf426/archive/2008/07/08/55582.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Code::Blocks在Debian下的绿色安装</title><link>http://www.cppblog.com/lf426/archive/2008/06/25/54572.html</link><dc:creator>lf426</dc:creator><author>lf426</author><pubDate>Wed, 25 Jun 2008 09:46:00 GMT</pubDate><guid>http://www.cppblog.com/lf426/archive/2008/06/25/54572.html</guid><wfw:comment>http://www.cppblog.com/lf426/comments/54572.html</wfw:comment><comments>http://www.cppblog.com/lf426/archive/2008/06/25/54572.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lf426/comments/commentRss/54572.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lf426/services/trackbacks/54572.html</trackback:ping><description><![CDATA[不想看废话的直接下载用就是了。我已经打包设置好了。^^<br><font color="blue">简短描述:</font><br>
<div align="left">媲美于VC的C++ IDE集成开发环境，具有较完善的自动补全功能。基于官方的Debian 8.02最新版本。已包含libwx2.8。（Debian etch源上的是2.6）。无须root权限安装，解压即可使用。<br></div>
<br><font color="blue">安装步骤:</font><br>
<div align="left">解压到自己安排的位置。cd到相关目录，运行sh脚本setup.sh就可以了。将生成sh脚本codeblocks，可直接通过该脚本启动。（实际上就是设置了LD_LIBRARY_PATH和CODEBLOCKS_DATA_DIR）</div>
<br>下载地址：<br><a title="http://www.fs2you.com/zh-cn/files/7de0ba0c-428f-11dd-812f-00142218fc6e/"  href="http://www.fs2you.com/zh-cn/files/7de0ba0c-428f-11dd-812f-00142218fc6e/">http://www.fs2you.com/zh-cn/files/7de0ba0c-428f-11dd-812f-00142218fc6e/</a><br><br>下面介绍自己进行绿色安装的过程。<br>首先到Code::Blocks的项目页下载最新的版本8.02。<br><a title="http://www.codeblocks.org/"  href="http://www.codeblocks.org/">http://www.codeblocks.org/</a><br>当然，我用的是Debian，下载的就是这个版本：codeblocks-8.02debian-i386.tar.gz。<br>解压后是一堆deb包，小心的把这些包解压到某个位置下的usr目录下。（注意，不是默认的/usr目录）。然后这个文件夹的名字不重要，是可以更换的。比如，我就换成了codeblocks。这时候，这个目录下应该有这些文件夹：bin, include, lib, share。其中，可执行文件在bin目录下。cd到bin目录下，检查codeblocks的依赖库及其路径：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">ldd&nbsp;codeblocks</span></div>
然后可以看到一大堆没有找到的so：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;linux</span><span style="color: #000000;">-</span><span style="color: #000000;">gate.so.</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;&nbsp;(</span><span style="color: #000000;">0xffffe000</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libgtk</span><span style="color: #000000;">-</span><span style="color: #000000;">x11</span><span style="color: #000000;">-</span><span style="color: #000000;">2.0</span><span style="color: #000000;">.so.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">libgtk</span><span style="color: #000000;">-</span><span style="color: #000000;">x11</span><span style="color: #000000;">-</span><span style="color: #000000;">2.0</span><span style="color: #000000;">.so.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0xb7ca1000</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libgdk</span><span style="color: #000000;">-</span><span style="color: #000000;">x11</span><span style="color: #000000;">-</span><span style="color: #000000;">2.0</span><span style="color: #000000;">.so.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">libgdk</span><span style="color: #000000;">-</span><span style="color: #000000;">x11</span><span style="color: #000000;">-</span><span style="color: #000000;">2.0</span><span style="color: #000000;">.so.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0xb7c20000</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libatk</span><span style="color: #000000;">-</span><span style="color: #000000;">1.0</span><span style="color: #000000;">.so.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">libatk</span><span style="color: #000000;">-</span><span style="color: #000000;">1.0</span><span style="color: #000000;">.so.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0xb7c06000</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libgdk_pixbuf</span><span style="color: #000000;">-</span><span style="color: #000000;">2.0</span><span style="color: #000000;">.so.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">libgdk_pixbuf</span><span style="color: #000000;">-</span><span style="color: #000000;">2.0</span><span style="color: #000000;">.so.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0xb7bf0000</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libpangocairo</span><span style="color: #000000;">-</span><span style="color: #000000;">1.0</span><span style="color: #000000;">.so.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">libpangocairo</span><span style="color: #000000;">-</span><span style="color: #000000;">1.0</span><span style="color: #000000;">.so.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0xb7be8000</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libXext.so.</span><span style="color: #000000;">6</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">libXext.so.</span><span style="color: #000000;">6</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0xb7bd9000</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libXinerama.so.</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">libXinerama.so.</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0xb7bd6000</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libXi.so.</span><span style="color: #000000;">6</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">libXi.so.</span><span style="color: #000000;">6</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0xb7bce000</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libXrandr.so.</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">libXrandr.so.</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0xb7bcb000</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libXcursor.so.</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">libXcursor.so.</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0xb7bc2000</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libXfixes.so.</span><span style="color: #000000;">3</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">libXfixes.so.</span><span style="color: #000000;">3</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0xb7bbd000</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libpango</span><span style="color: #000000;">-</span><span style="color: #000000;">1.0</span><span style="color: #000000;">.so.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">libpango</span><span style="color: #000000;">-</span><span style="color: #000000;">1.0</span><span style="color: #000000;">.so.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0xb7b82000</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libcairo.so.</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">libcairo.so.</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0xb7b20000</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libfreetype.so.</span><span style="color: #000000;">6</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">libfreetype.so.</span><span style="color: #000000;">6</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0xb7ab6000</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libz.so.</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">libz.so.</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0xb7aa2000</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libfontconfig.so.</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">libfontconfig.so.</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0xb7a77000</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libpng12.so.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">libpng12.so.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0xb7a54000</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libXrender.so.</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">libXrender.so.</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0xb7a4b000</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libX11.so.</span><span style="color: #000000;">6</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">libX11.so.</span><span style="color: #000000;">6</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0xb795f000</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libgobject</span><span style="color: #000000;">-</span><span style="color: #000000;">2.0</span><span style="color: #000000;">.so.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">libgobject</span><span style="color: #000000;">-</span><span style="color: #000000;">2.0</span><span style="color: #000000;">.so.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0xb7925000</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libgmodule</span><span style="color: #000000;">-</span><span style="color: #000000;">2.0</span><span style="color: #000000;">.so.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">libgmodule</span><span style="color: #000000;">-</span><span style="color: #000000;">2.0</span><span style="color: #000000;">.so.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0xb7922000</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libglib</span><span style="color: #000000;">-</span><span style="color: #000000;">2.0</span><span style="color: #000000;">.so.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">libglib</span><span style="color: #000000;">-</span><span style="color: #000000;">2.0</span><span style="color: #000000;">.so.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0xb7890000</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;librt.so.</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">tls</span><span style="color: #000000;">/</span><span style="color: #000000;">i686</span><span style="color: #000000;">/</span><span style="color: #000000;">cmov</span><span style="color: #000000;">/</span><span style="color: #000000;">librt.so.</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0xb7887000</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libcodeblocks.so.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;not&nbsp;found<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libwx_gtk2u_richtext</span><span style="color: #000000;">-</span><span style="color: #000000;">2.8</span><span style="color: #000000;">.so.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;not&nbsp;found<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libwx_gtk2u_aui</span><span style="color: #000000;">-</span><span style="color: #000000;">2.8</span><span style="color: #000000;">.so.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;not&nbsp;found<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libwx_gtk2u_xrc</span><span style="color: #000000;">-</span><span style="color: #000000;">2.8</span><span style="color: #000000;">.so.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;not&nbsp;found<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libwx_gtk2u_qa</span><span style="color: #000000;">-</span><span style="color: #000000;">2.8</span><span style="color: #000000;">.so.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;not&nbsp;found<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libwx_gtk2u_html</span><span style="color: #000000;">-</span><span style="color: #000000;">2.8</span><span style="color: #000000;">.so.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;not&nbsp;found<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libwx_gtk2u_adv</span><span style="color: #000000;">-</span><span style="color: #000000;">2.8</span><span style="color: #000000;">.so.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;not&nbsp;found<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libwx_gtk2u_core</span><span style="color: #000000;">-</span><span style="color: #000000;">2.8</span><span style="color: #000000;">.so.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;not&nbsp;found<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libwx_baseu_xml</span><span style="color: #000000;">-</span><span style="color: #000000;">2.8</span><span style="color: #000000;">.so.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;not&nbsp;found<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libwx_baseu_net</span><span style="color: #000000;">-</span><span style="color: #000000;">2.8</span><span style="color: #000000;">.so.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;not&nbsp;found<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libwx_baseu</span><span style="color: #000000;">-</span><span style="color: #000000;">2.8</span><span style="color: #000000;">.so.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;not&nbsp;found<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libpthread.so.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">tls</span><span style="color: #000000;">/</span><span style="color: #000000;">i686</span><span style="color: #000000;">/</span><span style="color: #000000;">cmov</span><span style="color: #000000;">/</span><span style="color: #000000;">libpthread.so.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0xb7872000</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libdl.so.</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">tls</span><span style="color: #000000;">/</span><span style="color: #000000;">i686</span><span style="color: #000000;">/</span><span style="color: #000000;">cmov</span><span style="color: #000000;">/</span><span style="color: #000000;">libdl.so.</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0xb786e000</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libstdc</span><span style="color: #000000;">++</span><span style="color: #000000;">.so.</span><span style="color: #000000;">6</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">libstdc</span><span style="color: #000000;">++</span><span style="color: #000000;">.so.</span><span style="color: #000000;">6</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0xb7789000</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libm.so.</span><span style="color: #000000;">6</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">tls</span><span style="color: #000000;">/</span><span style="color: #000000;">i686</span><span style="color: #000000;">/</span><span style="color: #000000;">cmov</span><span style="color: #000000;">/</span><span style="color: #000000;">libm.so.</span><span style="color: #000000;">6</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0xb7764000</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libgcc_s.so.</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">libgcc_s.so.</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0xb7759000</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libc.so.</span><span style="color: #000000;">6</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">tls</span><span style="color: #000000;">/</span><span style="color: #000000;">i686</span><span style="color: #000000;">/</span><span style="color: #000000;">cmov</span><span style="color: #000000;">/</span><span style="color: #000000;">libc.so.</span><span style="color: #000000;">6</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0xb7627000</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libpangoft2</span><span style="color: #000000;">-</span><span style="color: #000000;">1.0</span><span style="color: #000000;">.so.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">libpangoft2</span><span style="color: #000000;">-</span><span style="color: #000000;">1.0</span><span style="color: #000000;">.so.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0xb75fc000</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libXau.so.</span><span style="color: #000000;">6</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">libXau.so.</span><span style="color: #000000;">6</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0xb75f9000</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libexpat.so.</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">libexpat.so.</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0xb75d9000</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libXdmcp.so.</span><span style="color: #000000;">6</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">libXdmcp.so.</span><span style="color: #000000;">6</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0xb75d3000</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">ld</span><span style="color: #000000;">-</span><span style="color: #000000;">linux.so.</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0xb7f9c000</span><span style="color: #000000;">)<br></span></div>
其中libcodeblocks.so.0是Code::Blocks自带的，已经在lib目录下了，应为我们没有指定LD_LABRARY_PATH路径而找不到。<br>其它库是属于libwx的。在源中搜索一下：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">aptitude&nbsp;search&nbsp;libwx</span></div>
很不幸，源里面只有2.4和2.6版本的。所以，我们只好去wx官方去下载2.8的库。<br><a title="http://www.wxwidgets.org/"  href="http://www.wxwidgets.org/">http://www.wxwidgets.org/</a><br>我们在：<br><a title="http://apt.wxwidgets.org/dists/etch-wx/main/binary-i386/"  href="http://apt.wxwidgets.org/dists/etch-wx/main/binary-i386/">http://apt.wxwidgets.org/dists/etch-wx/main/binary-i386/</a><br>下找到我们需要的共享库文件：<br>
<pre><a  href="http://apt.wxwidgets.org/dists/etch-wx/main/binary-i386/libwxbase2.8-0_2.8.7.1-0_i386.deb">libwxbase2.8-0_2.8.7.1-0_i386.deb</a> <span style="font-family: sans-serif;">和 </span><a  href="http://apt.wxwidgets.org/dists/etch-wx/main/binary-i386/libwxgtk2.8-0_2.8.7.1-0_i386.deb">libwxgtk2.8-0_2.8.7.1-0_i386.deb</a> <br>（真快，今天已经更新2.8.8.0了-_-!!!应该也没问题，不过我没试）<br>把解压出来的so和s-link都放到codeblocks/lib/文件夹下面。最后，我们设置LD_LABRARY_PATH就可以了。<br>可以直接用这个脚本设置：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#</span><span style="color: #000000;">!/</span><span style="color: #000000;">bin</span><span style="color: #000000;">/</span><span style="color: #000000;">sh<br><br>echo&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">#!/bin/sh</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;codeblocks<br>echo&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">LD_LIBRARY_PATH=$PWD/lib&nbsp;CODEBLOCKS_DATA_DIR=$PWD&nbsp;$PWD/bin/codeblocks</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">&nbsp;codeblocks<br>chmod&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">x&nbsp;codeblocks</span></div>
生成的启动脚本应该类似这样：（$PWD表示当前目录，也就是codeblocks所在的位置。）<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#</span><span style="color: #000000;">!/</span><span style="color: #000000;">bin</span><span style="color: #000000;">/</span><span style="color: #000000;">sh<br>LD_LIBRARY_PATH</span><span style="color: #000000;">=/</span><span style="color: #000000;">home</span><span style="color: #000000;">/</span><span style="color: #000000;">lf426</span><span style="color: #000000;">/</span><span style="color: #000000;">app</span><span style="color: #000000;">/</span><span style="color: #000000;">code</span><span style="color: #000000;">/</span><span style="color: #000000;">codeblocks</span><span style="color: #000000;">/</span><span style="color: #000000;">lib&nbsp;CODEBLOCKS_DATA_DIR</span><span style="color: #000000;">=/</span><span style="color: #000000;">home</span><span style="color: #000000;">/</span><span style="color: #000000;">lf426</span><span style="color: #000000;">/</span><span style="color: #000000;">app</span><span style="color: #000000;">/</span><span style="color: #000000;">code</span><span style="color: #000000;">/</span><span style="color: #000000;">codeblocks&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">home</span><span style="color: #000000;">/</span><span style="color: #000000;">lf426</span><span style="color: #000000;">/</span><span style="color: #000000;">app</span><span style="color: #000000;">/</span><span style="color: #000000;">code</span><span style="color: #000000;">/</span><span style="color: #000000;">codeblocks</span><span style="color: #000000;">/</span><span style="color: #000000;">bin</span><span style="color: #000000;">/</span><span style="color: #000000;">codeblocks</span></div>
通过这个脚本就可以启动Code::Blocks了。整个过程不需要root权限哦（你不会想当root敢死队吧。^^）<br></pre><img src ="http://www.cppblog.com/lf426/aggbug/54572.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lf426/" target="_blank">lf426</a> 2008-06-25 17:46 <a href="http://www.cppblog.com/lf426/archive/2008/06/25/54572.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>