锘??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美日一区二区在线观看,国产精品五区,免费人成精品欧美精品http://m.shnenglu.com/lf426/category/7197.htmlGame Design Using C++ and SDLzh-cnMon, 07 Jun 2010 03:24:51 GMTMon, 07 Jun 2010 03:24:51 GMT60socket 緙栫▼鍏ラ棬鏁欑▼錛堜笁錛塗CP鍘熺悊錛?銆佽璁CP socket鐨勭被錛堜笅錛?/title><link>http://m.shnenglu.com/lf426/archive/2010/06/07/117299.html</link><dc:creator>lf426</dc:creator><author>lf426</author><pubDate>Sun, 06 Jun 2010 16:46:00 GMT</pubDate><guid>http://m.shnenglu.com/lf426/archive/2010/06/07/117299.html</guid><wfw:comment>http://m.shnenglu.com/lf426/comments/117299.html</wfw:comment><comments>http://m.shnenglu.com/lf426/archive/2010/06/07/117299.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/lf426/comments/commentRss/117299.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/lf426/services/trackbacks/117299.html</trackback:ping><description><![CDATA[鍦ㄥ彟澶栦竴杈圭殑瀹㈡埛绔紝鎴戜滑鍒嗘瀽涓涓婽CPClientSock鐨勫緩绔嬭繃紼嬨?br> <div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> TCPClientSock: </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> BaseSock{<br></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br>    sockaddr_in serverSockAddr;<br></span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">:<br>    </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> preBuffer;<br>    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> preBufferSize;<br>    mutable </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> preReceivedLength;<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>    TCPClientSock(<br>        </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> server_IP,<br>        unsigned </span><span style="COLOR: #0000ff">short</span><span style="COLOR: #000000"> server_port,<br>        </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> pre_buffer_size </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">32</span><span style="COLOR: #000000">);<br>    </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">TCPClientSock();<br>    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> TCPReceive() </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">;<br>    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> TCPSend(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> send_data,<br>            </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000"> data_length) </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">;<br>};</span></div> 鎴戜滑鐪嬪埌TCPClientSock鐨勭被涓嶵CPServerSock寰堢被浼鹼紝鏋勯犲嚱鏁扮殑宸埆鏄紝TCPClientSock闇瑕佹彁渚泂erver绔殑IP鍦板潃鍜岀鍙e彿銆?br> <div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000">TCPClientSock::TCPClientSock(<br>                    </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">server_IP,<br>                    unsigned </span><span style="COLOR: #0000ff">short</span><span style="COLOR: #000000"> server_port,<br>                    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> pre_buffer_size):<br>preBufferSize(pre_buffer_size),<br>preReceivedLength(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br>{<br>    preBuffer </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">[preBufferSize];<br><br>    sockFD </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);<br>    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (sockFD </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">) {<br>        sockClass::error_info(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">sock() failed.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>    }<br><br>    memset(</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">serverSockAddr, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, </span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(serverSockAddr));<br>    serverSockAddr.sin_family </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> AF_INET;<br>    serverSockAddr.sin_addr.s_addr </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> inet_addr(server_IP);<br>    serverSockAddr.sin_port </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> htons(server_port);<br><br>    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (connect(sockFD,<br>                (</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000"> sockaddr</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">serverSockAddr,<br>                </span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(serverSockAddr)) </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> ) {<br>        sockClass::error_info(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">connect() failed.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>    }<br>}<br><br>TCPClientSock::</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">TCPClientSock()<br>{<br>    delete [] preBuffer;<br>    close(sockFD);<br>}</span></div> TCPClientSock閫氳繃socket()寤虹珛璧穝ockFD錛岀劧鍚庢寚瀹氭湇鍔″櫒鐨剆erverSockAddr錛岀劧鍚庨氳繃connect()鍚憇erverSockAddr鎸囧畾鐨勬湇鍔″櫒鍙戝嚭鎻℃墜璇鋒眰銆傞渶瑕佽鏄庣殑鏄紝璋冪敤connect()鐨勬椂鍊欙紝緋葷粺浼氭鏌CPClientSock鐨剆ockFD鏄惁宸茬粡緇戝畾浜嗘湰鏈虹殑SockAddr錛屼簨瀹炰笂鎴戜滑涔熷彲浠ラ氳繃bind()灝嗘湰鏈虹殑IP鍜屾寚瀹氱殑绔彛鍙風粦瀹氬湪榪欎釜sockFD涓婏紝浣嗘槸鎴戜滑騫朵笉鍏沖績榪欎釜IP鍦板潃鍜岀鍙e彿錛堝喌涓斿緢澶氫富鏈哄茍娌℃湁鍏綉IP錛岀壒鍒湪涓浗錛夛紝鎵浠ラ氬父鎴戜滑涓嶈嚜宸卞幓緇戝畾錛岃繖鏍風郴緇熷氨浼氬府鎴戜滑瀹屾垚緇戝畾宸ヤ綔錛屽垎閰嶄竴涓┖闂茬殑绔彛鍙蜂綔涓烘湰鏈哄湴鍧鐨勭鍙e彿銆?br>榪欐牱TCPClientSock鍏鋒湁鏉ュ悜錛堟湰鏈哄湴鍧錛岄氬父鐢辯郴緇熻嚜鍔ㄥ畬鎴愮粦瀹氾紝涔熷彲浠ユ寚瀹氾級鍜屽幓鍚戯紙鎸囧畾鐨剆erver绔湴鍧錛夌殑鍦板潃淇℃伅錛屾墍浠ュ彲浠ユ敹鍙戜俊鎭備簬鏄紝TCPClientSock鍙戝嚭鐨勭涓涓暟鎹姤鏄彂緇檚erver鐩戝惉socket鐨勬彙鎵嬭姹傛暟鎹姤錛孴CPListenSock鎺ユ敹榪欎釜鏁版嵁鎶ュ悗錛屽皢鐩稿叧淇℃伅浼犻掔粰TCPServerSock寤虹珛鏂扮殑sockFD錛屾垜浠笂涓鑺傝鍒幫紝榪欎釜鏂扮殑sockFD寤虹珛璧鋒潵涔嬪悗椹笂灝卞悜client绔繑鍥炰竴涓暟鎹姤錛氫竴鏂歸潰琛ㄧず鎺ュ彈絎竴嬈℃彙鎵嬭姹傦紝鍙﹀涓鏂歸潰鍙戝嚭絎簩嬈℃彙鎵嬭姹傘?br>鏀跺埌絎簩嬈℃彙鎵嬭姹傚悗錛宑onnect()鎵嶄細榪斿洖錛屼笉鐒跺氨浼氶樆濉烇紝闈炲父“灝藉姏”鐨勫幓榪炴帴server銆傝繖涓?#8220;灝藉姏”鐨勭▼搴﹁窡緋葷粺鏈夊叧錛屽湪鎴戠殑璇曢獙涓紝windows涓嬪緢蹇紝灝卞嚑縐掞紱鑰孌ebian鍒欐帴榪?鍒嗛挓錛?br>connect()榪斿洖鐨勫悓鏃訛紝鍚憇erver鍙戝嚭浜嗙涓夋鎻℃墜鐨勪俊鎭紝榪欎釜淇℃伅鏄絎簩嬈℃彙鎵嬭姹傜殑璁ゅ彲銆傛墍浠ワ紝絎竴嬈″拰絎簩嬈℃彙鎵嬪寘鍚潃榪炴帴鐨勮姹傦紱鑰岀浜屾鍜岀涓夋鎻℃墜鍒欏寘鍚潃瀵規彙鎵嬭姹傜殑璁ゅ彲錛屼粬浠兘鏄湪鍛婅瘔瀵規柟錛氭垜鐭ラ亾騫跺悓鎰忎綘榪炴帴涓婃垜浜嗐?br>鑷蟲錛孴CP涓夋鎻℃墜鐨勬蹇靛湪socket涓畬鏁寸殑瀹炵幇錛屽緩绔嬭搗鏁版嵁嫻佺殑TCP閫氫俊閫氶亾銆? <img src ="http://m.shnenglu.com/lf426/aggbug/117299.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/lf426/" target="_blank">lf426</a> 2010-06-07 00:46 <a href="http://m.shnenglu.com/lf426/archive/2010/06/07/117299.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>socket 緙栫▼鍏ラ棬鏁欑▼錛堜笁錛塗CP鍘熺悊錛?銆佽璁CP socket鐨勭被錛堜腑錛?http://m.shnenglu.com/lf426/archive/2010/06/06/117297.htmllf426lf426Sun, 06 Jun 2010 15:46:00 GMThttp://m.shnenglu.com/lf426/archive/2010/06/06/117297.htmlhttp://m.shnenglu.com/lf426/comments/117297.htmlhttp://m.shnenglu.com/lf426/archive/2010/06/06/117297.html#Feedback0http://m.shnenglu.com/lf426/comments/commentRss/117297.htmlhttp://m.shnenglu.com/lf426/services/trackbacks/117297.html
class TCPServerSock: public BaseSock{
private:
    sockaddr_in clientSockAddr;
protected:
    
char* preBuffer;
    
int preBufferSize;
    mutable 
int preReceivedLength;
public:
    
explicit TCPServerSock(
        
const TCPListenSock& listen_sock,
        
int pre_buffer_size = 32);
    
virtual ~TCPServerSock();
    
int TCPReceive() const;
    
int TCPSend(const char* send_data,
            
const int& data_length) const;
};
榪欓噷錛屾垜浠負TCPServerSock棰勭暀涓涓紦瀛橈紝榪欎釜緙撳瓨騫朵笉鏄繀欏葷殑錛屼絾鏄緗繖鏍蜂竴涓紦瀛樿嚦灝戞湁涓や釜濂藉錛?br>1銆佸彲浠ュ湪浣跨敤鏃朵笉蹇呬笓闂ㄤ負recv()寤虹珛緙撳瓨錛?br>2銆佺被鏂規硶TCPReceive()鍜孴CPSend()鍙互鍏變韓榪欎釜緙撳瓨錛屽湪澶勭悊寰堝闂鏃跺欏緢鏂逛究錛屾瘮濡俥cho錛屽氨涓嶉渶瑕佸厛鎶妑ecv()鐨勭紦瀛樿鍑烘潵鍐嶇敱send()鏉ュ彂閫併?br>灝嗙紦瀛樺凡鐢ㄩ暱搴reReceiveLength鍔犱笂鍏抽敭瀛梞utable琛ㄧず鎴戜滑涓嶅叧蹇冭繖涓暱搴︿細琚洿鏀癸紝鎴戜滑鍙湪涔庢湁涓涓紦瀛樺彲浠ョ敤錛屼絾鏄疄闄呯敤浜嗗灝戜笉閲嶈錛岃繖鏍鋒垜浠氨鍙互涓烘帴鍙楀拰鍙戦佺殑綾繪柟娉曞姞涓奵onst銆?br>鎴戜滑鍥炲埌TCPServerSock鐨勫緩绔嬶紝TCPServerSock閫氳繃TCPListenSock accept()涓涓繙紼嬬殑client connect()鎻℃墜璇鋒眰鑰屽緩绔嬶紝鎵浠ワ紝TCPServerSock鐨勬瀯閫犲湪榛樿鎯呭喌涓嬫槸闃誨鐨勩?br>
TCPServerSock::TCPServerSock(
                
const TCPListenSock& listen_sock,
                
int pre_buffer_size):
preBufferSize(pre_buffer_size),
preReceivedLength(
0)
{
    preBuffer 
= new char[preBufferSize];

    socklen_t
 clientSockAddrLen = sizeof(clientSockAddr);
    sockFD 
= accept(    listen_sock.showSockFD(),
                        (sockaddr
*)&clientSockAddr,
                        
&clientSockAddrLen);
    
if (sockFD < 0) {
        sockClass::error_info(
"accept() failed.");
    }
    std::cout    
<< "Client (IP: "
                
<< inet_ntoa(clientSockAddr.sin_addr)
                
<< ") conneted." << std::endl;
}

TCPServerSock::
~TCPServerSock()
{
    delete [] preBuffer;
    close(sockFD);
}
榪欓噷闇瑕佹敞鎰忎竴涓狶inux鍜學indows涓嬬殑涓嶅悓錛?br>瀵逛簬sockaddr_in錛堜篃鍖呮嫭sockaddr錛夌殑澶у皬錛岃accept()鎸囧畾鐨勬椂鍊欙紝Linux涓敤鐨勬槸socklen_t錛屽叾瀹炶繖灝辨槸size_t錛屼篃灝辨槸unsigned int銆傝學inSock涓嵈鐢ㄧ殑鏄痠nt銆傚洜涓哄湪緙栬瘧涓笉浼氳嚜鍔ㄨ漿鎹紝鎵浠ヤ細鎻愮ず閿欒銆?br>鍐嶆寮鴻皟錛孴CPServerSock鐨剆ockFD鏄氳繃accept()寤虹珛鐨勮屼笉鏄痵ocket()錛岃繖涔熸槸鍞竴涓涓笉鐢╯ocket()寤虹珛鐨剆ockFD錛堝寘鎷琔DP鐨勶級銆傚湪client鍙戝嚭鐨刢onnect()鎻℃墜璇鋒眰鐨勬暟鎹姤涓紝鍚屾椂鍖呭惈鐫client绔殑鍦板潃淇℃伅錛圛P鍦板潃鍜岀鍙o級鍜宻erver绔殑鍦板潃淇℃伅錛圛P鍦板潃鍜岀鍙o級錛屾鏄繖涓彙鎵嬭姹傛暟鎹姤涓殑涓よ竟鐨勫湴鍧淇℃伅閫氳繃accept()琚紶閫掑埌TCPServerSock鐨剆ockFD涓傝娉ㄦ剰錛宻erver绔殑淇℃伅騫墮潪鐢盩CPListenSock鎻愪緵錛屽洜涓篢CPListenSock涓璴istenSockAddr鐨処P鍦板潃涓虹┖錛圛NADDR_ANY == 0錛夛紝鑰孴CPServerSock涓璼erver绔殑SockAddr鍗存槸鍏蜂綋鐨勶紝鐢卞鎴風鐨勬彙鎵嬪崗璁紶鏉ョ殑錛堜絾鏄病鏈夊叿浣撶殑浣撶幇鍑烘潵錛夈傚彧鏈夊叿浣撶殑鍦板潃錛圛P鍦板潃鍜岀鍙o級鎵嶈兘鎻愪緵IP鏁版嵁鍖呯殑鐩殑鍦版柟鍚戙傝岀鍙e彿錛屽垯鍥犱負client浜嬪厛鐭ラ亾鐩戝惉绔彛鍙鳳紝浠庤屽湪鎻℃墜璇鋒眰涓寘鍚紝鏈緇堜紶閫掔粰TCPListenSock涓璼erver绔殑SockAddr錛岃櫧鐒惰繖涓繃紼嬪喅瀹氫簡榪欎釜绔彛鍙風瓑浜庣洃鍚鍙e彿錛屼絾鏄渶瑕佹槑鐧界殑鏄紝榪欎釜绔彛鍙鋒潵鑷彙鎵嬭姹傜殑鏁版嵁鎶ヨ屼笉鏄疶CPListenSock鐨刲istenSockAddr銆?br>鏂扮殑sockFD鍏鋒湁鏉ュ悜錛堟湰鏈猴級鍜屽幓鍚戯紙榪滅▼錛夌殑淇℃伅錛屾墍浠ュ彲浠ユ敹鍙戞暟鎹俆CPServerSock鐨剆ockFD涓鏃﹀緩绔嬶紝椹笂鍚戣繙紼嬭繑鍥炰竴涓暟鎹姤錛岃繖涓暟鎹姤鏈変袱灞傛剰涔夛細
1銆佽〃紺簊erver宸茬粡鎺ユ敹浜哻lient鐨勬彙鎵嬭姹傦紱
2銆佸client鍙戝嚭涓巗erver榪欎釜鏂皊ockFD鎻℃墜鐨勮姹傘?br>榪欏氨鏄墍璋撶浜屾鎻℃墜錛屽茍涓斾篃鏄互鏁版嵁鎶ョ殑褰㈠紡浼犻佺殑銆傛垜浠榪囷紝TCP鍗忚鐨勭洰鏍囨槸寤虹珛“鍙潬”鐨勬暟鎹祦褰㈠紡鐨勯氳錛屽湪榪欎釜鏁版嵁嫻佺殑閫氶亾寤虹珛璧鋒潵浠ュ墠錛屽彧鑳介噰鐢ㄦ暟鎹姤鐨勫艦寮忎紶閫佹暟鎹?

lf426 2010-06-06 23:46 鍙戣〃璇勮
]]>
socket 緙栫▼鍏ラ棬鏁欑▼錛堜笁錛塗CP鍘熺悊錛?銆佽璁CP socket鐨勭被錛堜笂錛?/title><link>http://m.shnenglu.com/lf426/archive/2010/06/06/117289.html</link><dc:creator>lf426</dc:creator><author>lf426</author><pubDate>Sun, 06 Jun 2010 14:24:00 GMT</pubDate><guid>http://m.shnenglu.com/lf426/archive/2010/06/06/117289.html</guid><wfw:comment>http://m.shnenglu.com/lf426/comments/117289.html</wfw:comment><comments>http://m.shnenglu.com/lf426/archive/2010/06/06/117289.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/lf426/comments/commentRss/117289.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/lf426/services/trackbacks/117289.html</trackback:ping><description><![CDATA[鎴戜滑鍦ㄧ1鑺備腑璁茶繃錛宻ocket鏄竴涓猧nt鐨勬枃浠舵弿榪扮錛圵inSock涓洿鎺ユ槸涓縐嶆娊璞$殑鎻忚堪絎︼級錛屾垜浠氳繃瀵硅繖涓弿榪扮鍙戝嚭鎸囦護鎿嶄綔socket銆傝繖鏄疌璇█鐨勬濇兂錛屽湪闈㈠悜瀵硅薄鐨勬濇兂涓紝鏈濂絪ocket鏈韓鏄竴縐嶅璞★紝鍚勭鏂規硶鐢卞璞℃湰韜彂鍑恒傜敤闈㈠悜瀵硅薄鐨勬濇兂灝佽socket騫朵笉鍥伴毦錛岃屼笖錛屽浜庢弿榪皊ocket鐨勬蹇靛彲鑳芥洿鍔犵洿瑙傦紝榪欎竴鑺傦紝鎴戜滑杈逛粙緇峴ocket鍜孴CP鐨勬蹇佃竟瀵箂ocket榪涜OO灝佽銆?br>棣栧厛錛屾瘡涓涓猻ocket瀵硅薄閮藉叿鏈夊敮涓鐨剆ocket鏂囦歡鎻忚堪絎︼紝榪欐牱鍙互寰堝ソ鐨勫搴攕ocket鐨勬蹇點傛墍浠ユ垜浠瀯寤轟竴涓熀綾伙紝騫惰鍏舵垚涓虹函铏氬嚱鏁扳斺旇繖鏄洜涓簊ocket鏂囦歡鎻忚堪絎﹀繀欏誨湪鍏蜂綋鐨勬瀯閫犱腑鎵嶈兘鍑虹幇錛岀劧鍚庝粛鐒朵繚鐣欎竴涓繑鍥炲師濮嬬殑socket鏂囦歡鎻忚堪絎︾殑鎺ュ彛錛岃繖鏄負浜嗕笉鏂逛究褰掔粨鍒扮被鍑芥暟涓殑鍑芥暟鎵棰勭暀鍑嗗鐨勶紝姣斿鏋佸叾閲嶈鐨剆elect()鎴戜滑浼氬湪鍚庨潰璁插埌錛屾墍璋撴湁澶囨棤鎮c?br> <div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> BaseSock{<br></span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">:<br>    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> sockFD;<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>    BaseSock();<br>    </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">BaseSock() </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>    </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000"> showSockFD() </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">;<br>};<br></span></div> 鍑芥暟瀹炵幇錛?br> <div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">class BaseSock</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>BaseSock::BaseSock():<br>sockFD(</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br>{}<br><br>BaseSock::</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">BaseSock()<br>{}<br><br></span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000"> BaseSock::showSockFD() </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"><br>{<br>    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> sockFD;<br>}</span></div> 鎴戜滑鎶妔ockFD鐨勫垵濮嬪艱緗負-1錛岃〃鏄庡湪娌℃湁媧劇敓綾繪瀯閫犵殑鏃跺欒繖鏄竴涓潪娉曠殑鏂囦歡鎻忚堪絎﹀彿錛團ile Descriptor錛夈?br>鎺ヤ笅鏉ワ紝鎴戜滑綆鍗曞洖欏句竴涓嬬涓鑺傚浜嶵CP Server鐨勫緩绔嬶細<br>棣栧厛錛屾垜浠渶瑕佸緩绔嬩竴涓洃鍚瑂ocket錛岀劧鍚庢縺媧誨叾鐩戝惉錛?br>鐒跺悗錛屽湪client绔繛鎺ヤ俊鎭繃鏉ヤ箣鍚庯紝閫氳繃鐩戝惉绔彛灝嗗鎴風鐨勪俊鎭紶閫掔粰鏂扮殑socket錛屼粠鑰屽緩绔嬮氳socket銆?br>鎴戜滑鍏堟瀯寤簂isten socket錛?br> <div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> TCPListenSock: </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> BaseSock{<br></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br>    sockaddr_in listenSockAddr;<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>    </span><span style="COLOR: #0000ff">explicit</span><span style="COLOR: #000000"> TCPListenSock(unsigned </span><span style="COLOR: #0000ff">short</span><span style="COLOR: #000000"> listen_port);<br>    </span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">TCPListenSock();<br>    </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> TCPListen(<br>        </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> max_connection_requests </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">) </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">;<br>};</span></div> TCPListenSock寤虹珛鐨勭洰鐨勭殑灝辨槸琚姩鐨勭瓑寰卌lient绔鎵炬彙鎵嬬殑connect()錛屼粠鑰屾敹闆哻lient绔殑sock鍦板潃淇℃伅錛堝寘鍚簡IP鍦板潃鍜岀鍙e彿錛夛紝鐒跺悗鍦ㄩ渶瑕佺殑鏃跺欎紶閫掔粰鏂扮殑socket寤虹珛閫氳socket銆?br> <div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000">TCPListenSock::TCPListenSock(unsigned </span><span style="COLOR: #0000ff">short</span><span style="COLOR: #000000"> listen_port)<br>{<br>    sockFD </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> socket(PF_INET,<br>                    SOCK_STREAM,<br>                    IPPROTO_TCP);<br>    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (sockFD </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">) {<br>        sockClass::error_info(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">socket() failed.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>    }<br>    memset(</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">listenSockAddr, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, </span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(listenSockAddr));<br>    listenSockAddr.sin_family </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> AF_INET;<br>    listenSockAddr.sin_addr.s_addr </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> htonl(INADDR_ANY);<br>    listenSockAddr.sin_port </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> htons(listen_port);<br>    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (bind(    sockFD,<br>                (sockaddr</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">listenSockAddr,<br>                </span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(listenSockAddr)) </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">) {<br>        sockClass::error_info(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">bind() failed.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>    }<br>}<br><br>TCPListenSock::</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">TCPListenSock()<br>{<br>    close(sockFD);<br>}</span></div> TCPListenSock閫氳繃璋冪敤socket()寤虹珛sockFD錛涢氳繃鎸囧畾绔彛濂芥寚鏄庣洃鍚鍙o紝榪欐槸涓哄鎴風鑳藉鎵懼埌榪欎釜绔彛鎵蹇呴』鐨勩傝孖P鍦板潃璁劇疆涓篒NADDR_ANY錛屽叾瀹炲氨鏄?錛岃繖鎰忓懗鐫鍙互鏄換浣曚竴涓猻erver绔墍鎷ユ湁鐨処P銆俆CPListenSock閫氳繃bind()灝唖ockFD鍜孲ockAddr緇戝畾鍦ㄤ竴璧楓傝繖涓猻ockFD鍙湁鏈満鐨凷ockAddr鎰忓懗鐫錛?銆佹棤娉曞緩绔嬭繛鎺ワ紝鍙湁鎺ュ彈鏁版嵁鎶ワ紱2銆佸彧鑳芥帴鍙椾俊鎭紝鍥犱負娌℃湁榪滅▼鐩殑鍦扮殑SockAddr鑰屾棤娉曞彂鍑轟俊鎭?br>鑰岃繖瀵逛簬TPC寤虹珛榪炴帴鐨勮繃紼嬫潵璇達紝鏃㈡槸瓚沖鐨勶紝涔熸槸蹇呴』鐨勩備簨瀹炰笂錛宑lient绔彂鍑虹殑絎竴涓彙鎵嬫暟鎹姤灝辮榪欎釜sockFD鎵鎺ユ敹錛岃岃繑鍥炵粰client鐨勬彙鎵嬪簲絳斿拰瀵筩lient鐨勬彙鎵嬭姹傚垯鐢辨柊鐨剆ockFD鍙戝嚭銆?br>listen()鏄皢TCPListenSock嬋媧諱負鐩戝惉鐘舵侊紝濡傛灉涓嶆縺媧伙紝閭d箞浠諱綍鎻℃墜鐨勮繛鎺ヨ姹傞兘灝嗚榪欎釜sockFD鎵蹇界暐銆?br> <div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> TCPListenSock::TCPListen(<br>                        </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> max_connection_requests) </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"><br>{<br>    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (listen(    sockFD,<br>                max_connection_requests) </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">) {<br>        sockClass::error_info(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">listen() failed.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>    }<br>}</span></div> 榪欎釜鍑芥暟鐪嬫潵浼間箮鏈変簺澶氭涓涓撅紝鍥犱負榪欎釜鐩戝惉鏄彲浠ユ暣鍚堝埌鏋勯犲嚱鏁頒腑鐨勶紝涔熷氨鏄錛屾垜浠彲浠ヤ竴鏃﹀緩绔婽CPListenSock灝變護鍏舵縺媧伙紝浜嬪疄涓婅繖姝f槸SDL_net涓殑鍋氭硶錛屼篃鏄鎴戞劅鍒頒笉涓ヨ皚鐨勫湴鏂癸紝鍥犱負鐩戝惉鏈韓鏄痵ocket鐨勪竴涓蹇點? <img src ="http://m.shnenglu.com/lf426/aggbug/117289.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/lf426/" target="_blank">lf426</a> 2010-06-06 22:24 <a href="http://m.shnenglu.com/lf426/archive/2010/06/06/117289.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>socket 緙栫▼鍏ラ棬鏁欑▼錛堜笁錛塗CP鍘熺悊錛?銆乻ocket寮傚父淇℃伅http://m.shnenglu.com/lf426/archive/2010/06/06/117284.htmllf426lf426Sun, 06 Jun 2010 13:07:00 GMThttp://m.shnenglu.com/lf426/archive/2010/06/06/117284.htmlhttp://m.shnenglu.com/lf426/comments/117284.htmlhttp://m.shnenglu.com/lf426/archive/2010/06/06/117284.html#Feedback0http://m.shnenglu.com/lf426/comments/commentRss/117284.htmlhttp://m.shnenglu.com/lf426/services/trackbacks/117284.html鍥犱負socket鏄睘浜庣郴緇熺殑錛屾墍浠ヤ笉鍚岀殑緋葷粺瀵逛簬socket鏈夌潃澶у悓灝忓紓鐨勮В閲婏紝鍑洪敊鎻忚堪涔熶笉灝界浉鍚屻傚湪Linux涓紝socket鐨勫紓甯鎬俊鎭彲浠ラ氳繃errno鑾峰緱錛坕nt綾誨瀷錛夛紝鐒跺悗鍙互閫氳繃鍑芥暟strerror()灝唅nt杞崲鎴愬瓧絎︿覆鎻忚堪錛涗篃鍙互閫氳繃鍑芥暟perror()鐩存帴鑾峰緱鍏舵弿榪般?br>瑕佷嬌鐢╡rrno闇瑕佸寘鍚ご鏂囦歡<errno.h>銆傛垜寤鴻浣跨敤errno鑾峰緱int綾葷殑閿欒淇℃伅鐨勪竴涓噸瑕佸師鍥犲湪浜庯紝socket鐨勫紓甯鎬笉涓瀹氬氨蹇呯劧瀵艱嚧紼嬪簭緇堟銆侭jarne Stroustrup鍦ㄤ粙緇岰++寮傚父鏈哄埗鐨勬椂鍊欏C椋庢牸鐨勫紓甯告満鍒舵湁鐫榪欐牱鐨勬弿榪幫細錛圕++瀵逛簬寮傚父錛夌殑榛樿鍝嶅簲鏂瑰紡鏄粓姝㈢▼搴忋備紶緇熺殑鍙嶅簲錛堝浜庡彂鐢熷紓甯哥殑鏃跺欙級鍒欐槸瑁呯硦娑傦紝鎺ョ潃鍋氫笅鍘伙紝浠ユ湡寰楀埌鏈濂界殑緇撴灉錛堛奀++紼嬪簭璁捐璇█銆嬬14绔?寮傚父澶勭悊錛夈備笉榪囦互鎴戠洰鍓嶇殑姘村鉤鐪嬫潵錛岀粓姝㈡鍦ㄨ繘琛岀殑紼嬪簭鐒跺悗鍐嶉氳繃寮傚父鏈哄埗閲嶆柊鍚姩涓涓柊鐨勬祦紼嬶紝鍏朵唬浠瘋繙榪滃ぇ浜?#8220;瑁呯硦娑?#8221;鐨勮紼嬪簭緇х畫榪愯涓嬪幓錛屽彧瑕侀敊璇笉鏄嚧鍛界殑錛岄氳繃綆鍗曠殑鍒ゆ柇鍜屽鐞嗘垨璁告晥鏋滄洿浣熾?br>渚嬪錛宻ocket涓氨鏈変竴涓緢鏈変唬琛ㄦх殑鎯呭喌錛屽湪TCP榪炴帴涓紝濡傛灉涓鏂規剰澶栭鍑衡斺斾篃灝辨槸璇存病鏈夐氳繃TCP閫鍑烘祦紼嬮鍑猴紝姣斿娌℃湁榪愯瀹岀▼搴忓叧闂帀socket鑰岀洿鎺鎺夋垨鑰匔trl+c浜嗐俿ocket寰寰浼氬洜涓簉ecv()榪斿洖鍊煎皬浜?鑰屾姏鍑轟竴涓紓甯搞傛甯告柇寮榪炴帴鐨勬椂鍊欙紝recv()浼氶氳繃榪斿洖0琛ㄧず榪炴帴宸茬粡鏂紑錛屼絾鏄ぇ澶氭暟鏃跺欙紝鎴戜滑騫朵笉甯屾湜鍥犱負寮傚父鐨勬柇寮灝卞鑷村彟澶栦竴绔殑紼嬪簭緇堟錛堟兂璞′竴涓嬪鏋滀綘鍏蟲帀QQ鑵捐鐨勬湇鍔″櫒紼嬪簭灝辯粓姝㈡槸浠涔堟蹇?#8230;…錛夛紝鎵浠ユ垜浠繀欏誨鐞嗚繖縐嶆儏鍐點?br>鍦↙inux涓紝榪滅▼榪炴帴寮傚父鏂紑錛堣閲嶇疆錛夌殑errno浠g爜鏄?04錛岀被浼肩殑錛屾垜浠簲璇ヤ繚璇佸嚭鐜拌繖縐嶅紓甯哥殑鏃跺欑▼搴忓彲浠ョ戶緇繍琛屻?br>
//Filename: SockClass.hpp

#ifndef SOCK_CLASS_HPP
#define SOCK_CLASS_HPP

#include 
<unistd.h>
#include 
<iostream>
#include 
<sys/socket.h>
#include 
<arpa/inet.h>
#include 
<errno.h>

namespace sockClass
{
void error_info(const char* s);
}
浠ヤ笂鏄ご鏂囦歡涓殑澹版槑錛屼笅闈㈡槸鍑芥暟錛屾垜浠繖閲屼粎浠呮紨紺哄鐞嗕簡104閿欒銆?br>
namespace sockClass
{
void error_info(const char* s)
{
    
int err_info = errno;
    std::cerr 
<< strerror(err_info) << ": errno: " << err_info << std::endl;
    
if (err_info == 104){
        
return;
    }
    exit(
1);
}
}
鍦╳indows涓紝閿欒浠g爜鐢盬SAGetLastError()鑾峰緱錛岃屾棤闇璁劇疆errno銆?br>
//Filename: SockClass.hpp

#ifndef SOCK_CLASS_HPP
#define SOCK_CLASS_HPP

#include 
<iostream>
#include 
<winsock2.h>

namespace sockClass
{
void error_info(const char* s);
}
WinSock鐨勯敊璇唬鐮佽窡Linux涓殑涓嶄竴鏍鳳紝鍚屾牱鐨勫紓甯革紝WinSock鐨勯敊璇唬鐮佹槸10054銆?br>騫朵笖錛岀敱浜庢病鏈塭rrno涔熷氨鏃犱粠璋冪敤strerror()錛屾垜浠渶濂借嚜宸卞啓鍑鴻緇嗙殑寮傚父淇℃伅銆?br>WinSock鐨勮緇嗕唬鐮佷俊鎭湪榪欓噷錛?br>http://msdn.microsoft.com/en-us/library/ms740668(v=VS.85).aspx
win32涓嬬殑婕旂ず浠g爜濡備笅錛?br>
namespace sockClass
{
void error_info(const char* s)
{
    
int winsock_err = WSAGetLastError();
    perror(s);
    std::cerr 
<< "WinSock Error: " << winsock_err << std::endl;
    
if (winsock_err == WSAECONNRESET) {
        std::cerr 
<< "Connection reset by peer." << std::endl;
        
return;
    }
    exit(
1);
}
}


lf426 2010-06-06 21:07 鍙戣〃璇勮
]]>
socket 緙栫▼鍏ラ棬鏁欑▼錛堜竴錛塗CP server 绔細8銆佹湰绔犵殑瀹屾暣婧愪唬鐮?/title><link>http://m.shnenglu.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://m.shnenglu.com/lf426/archive/2008/07/16/56281.html</guid><wfw:comment>http://m.shnenglu.com/lf426/comments/56281.html</wfw:comment><comments>http://m.shnenglu.com/lf426/archive/2008/07/16/56281.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.shnenglu.com/lf426/comments/commentRss/56281.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/lf426/services/trackbacks/56281.html</trackback:ping><description><![CDATA[<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Filename: TcpServerClass.hpp</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>#ifndef TCPSERVERCLASS_HPP_INCLUDED<br></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000"> TCPSERVERCLASS_HPP_INCLUDED</span><span style="COLOR: #000000"><br><br>#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">unistd.h</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br>#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br>#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">sys</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">socket.h</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br>#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">arpa</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">inet.h</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> TcpServer<br>{<br></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br>    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> listenSock;<br>    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> communicationSock;<br>    sockaddr_in servAddr;<br>    sockaddr_in clntAddr;<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>    TcpServer(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> listen_port);<br>    </span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000"> isAccept();<br>    </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> handleEcho();<br>};<br><br><br></span><span style="COLOR: #0000ff">#endif</span><span style="COLOR: #000000"> </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> TCPSERVERCLASS_HPP_INCLUDED</span></div> <br> <div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><!--<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: TcpServerClass.cpp</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>#include </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"> listen_port)<br>{<br>    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> ( (listenSock </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> ) {<br>        </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">socket() failed</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>    }<br><br>    memset(</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">servAddr, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, </span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(servAddr));<br>    servAddr.sin_family </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> AF_INET;<br>    servAddr.sin_addr.s_addr </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> htonl(INADDR_ANY);<br>    servAddr.sin_port </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> htons(listen_port);<br><br>    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> ( bind(listenSock, (sockaddr</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">servAddr, </span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(servAddr)) </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> ) {<br>        </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">bind() failed</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>    }<br><br>    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> ( listen(listenSock, </span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">) </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> ) {<br>        </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">listen() failed</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>    }<br>}<br><br></span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000"> TcpServer::isAccept()<br>{<br>    unsigned </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> clntAddrLen </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(clntAddr);<br><br>    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> ( (communicationSock </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> accept(listenSock, (sockaddr</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">clntAddr, </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">clntAddrLen)) </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> ) {<br>        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br>    } </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"> {<br>        std::cout </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Client(IP: </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> inet_ntoa(clntAddr.sin_addr) </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">) connected.\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br>    }<br>}<br><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> TcpServer::handleEcho()<br>{<br>    </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> BUFFERSIZE </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">32</span><span style="COLOR: #000000">;<br>    </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> buffer[BUFFERSIZE];<br>    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> recvMsgSize;<br>    </span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000"> goon </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br><br>    </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000"> ( goon </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000"> ) {<br>        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> ( (recvMsgSize </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> recv(communicationSock, buffer, BUFFERSIZE, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)) </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> ) {<br>            </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">recv() failed</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>        } </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> ( recvMsgSize </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> ) {<br>            goon </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br>        } </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"> {<br>            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> ( send(communicationSock, buffer, recvMsgSize, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">) </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> recvMsgSize ) {<br>                </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">send() failed</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>            }<br>        }<br>    }<br><br>    close(communicationSock);<br>}</span></div> <br>婕旂ず紼嬪簭錛?br> <div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><!--<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: main.cpp<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Tcp Server C++ style, single work</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br>#include </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"> echo_server(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> argc, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> argv[]);<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> argc, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> argv[])<br>{<br>    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> mainRtn </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>    </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"> {<br>        mainRtn </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> echo_server(argc, argv);<br>    }<br>    </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"> ( </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> s ) {<br>        perror(s);<br>        exit(EXIT_FAILURE);<br>    }<br><br>    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> mainRtn;<br>}<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> echo_server(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> argc, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> argv[])<br>{<br>    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> port;<br>    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> ( argc </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">2</span><span style="COLOR: #000000"> ) {<br>        port </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> atoi(argv[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]);<br>    } </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"> {<br>        port </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">5000</span><span style="COLOR: #000000">;<br>    }<br><br>    TcpServer myServ(port);<br><br>    </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000"> ( </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000"> ) {<br>        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> ( myServ.isAccept() </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000"> ) {<br>            myServ.handleEcho();<br>        }<br>    }<br><br>    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}</span></div> <br><br> <img src ="http://m.shnenglu.com/lf426/aggbug/56281.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/lf426/" target="_blank">lf426</a> 2008-07-16 12:57 <a href="http://m.shnenglu.com/lf426/archive/2008/07/16/56281.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>socket 緙栫▼鍏ラ棬鏁欑▼錛堜竴錛塗CP server 绔細7銆佹帴鏀朵笌鍙戦?/title><link>http://m.shnenglu.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://m.shnenglu.com/lf426/archive/2008/07/16/56279.html</guid><wfw:comment>http://m.shnenglu.com/lf426/comments/56279.html</wfw:comment><comments>http://m.shnenglu.com/lf426/archive/2008/07/16/56279.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/lf426/comments/commentRss/56279.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/lf426/services/trackbacks/56279.html</trackback:ping><description><![CDATA[浣滆咃細榫欓<br><br>        鐜板湪錛屾垜浠氳繃accept()鍒涘緩浜嗘柊鐨剆ocket錛屼篃灝辨槸鎴戜滑綾諱腑鐨勬暟鎹垚鍛榗ommunicationSock錛岀幇鍦紝鎴戜滑灝卞彲浠ラ氳繃榪欎釜socket榪涜閫氳浜嗐?br><br>TCP閫氳妯″瀷<br><br>        鍦ㄤ粙緇嶅嚱鏁頒箣鍓嶏紝鎴戜滑搴旇浜嗚В涓浜涗簨瀹炪俆CP鐨凷erver/Client妯″瀷綾諱技榪欐牱錛?br>ServApp鈥斺擲ervSock鈥斺擨nternet鈥斺擟lntSock鈥斺擟lntApp<br>褰撶劧錛屾垜浠繖閲岀殑socket鎸囩殑灝辨槸鐢ㄤ簬“閫氳”鐨剆ocket銆俆CP鐨剆erver绔嚦灝戞湁涓や釜socket錛屼竴涓敤浜庣洃鍚紝涓涓敤浜庨氳錛汿CP鐨剆erver绔彲浠ュ彧鏈変竴涓猻ocket錛岃繖涓猻ocket鍚屾椂“鎻?#8221;鍦╯erver鐨勪袱涓猻ocket涓娿傚綋鐒訛紝鎻掍笂listen socket鐨勭洰鐨勫彧鏄負浜嗗垱寤篶ommunication socket錛屽垱寤哄畬澶囧悗錛宭isten鏄彲浠ュ叧闂殑銆備絾鏄紝濡傛灉榪欐牱錛屽叾浠栫殑client灝辨棤娉曞啀榪炴帴涓妔erver浜嗐?br>        鎴戜滑榪欎釜妯″瀷錛屾槸client鐨剆ocket鎻掑湪server鐨刢ommunication socket涓婄殑紺烘剰銆傝繖涓や釜socket錛岄兘鎷ユ湁瀹屾暣鐨勬湰鍦板湴鍧淇℃伅浠ュ強榪滅▼璁$畻鏈哄湴鍧淇℃伅錛屾墍浠ワ紝榪欎袱涓猻ocket浠ュ強涔嬮棿鐨勭綉緇滃疄闄呬笂褰㈡垚浜嗕竴鏉″艦寮忎笂“灝侀棴”鐨勭閬撱傛暟鎹寘鍙浠庝竴绔繘鏉ワ紝灝辮兘鐭ラ亾鍑哄幓鐨勭洰鐨勫湴錛屽弽涔嬩害鐒躲傝繖姝f槸TCP鍗忚錛屾暟鎹祦褰㈠紡鎶借薄鍖栦互鍙婂疄鐜般傚洜涓轟笉鍐嶉渶瑕佹寚鏄?#8220;鍑哄”鍜?#8220;鍘誨悜”錛屽榪欐牱鐨剆ocket錛堝疄闄呬笂鏄疭/C涓婄殑socket瀵癸級鐨勬搷浣滐紝灝卞鍚屽鏈湴鏂囦歡鎻忚堪絎︾殑鎿嶄綔涓鏍楓備絾鏄紝灝界鎴戜滑鍙互浣跨敤read()鍜寃rite()錛屼絾鏄紝涓轟簡瀹岀編鐨勬帶鍒訛紝鎴戜滑鏈濂戒嬌鐢╮ecv()鍜宻end()銆?br><br>recv()鍜宻end()<br> <div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><!--<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"> send(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> socket, </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> msg, unsigned </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> msgLength, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> flags);<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> recv(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> socket, </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> rcvBuffer, unsigned </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> bufferLength, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> flags);</span></div> 鍦↙inux涓殑瀹炵幇涓猴細<br> <div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">sys</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">socket.h</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> Send N bytes of BUF to socket FD.  Returns the number sent or -1.<br><br>   This function is a cancellation point and therefore not marked with<br>   __THROW.  </span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">extern</span><span style="COLOR: #000000"> ssize_t send (</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> __fd, __const </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">__buf, size_t __n, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> __flags);<br><br></span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> Read N bytes into BUF from socket FD.<br>   Returns the number read or -1 for errors.<br><br>   This function is a cancellation point and therefore not marked with<br>   __THROW.  </span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">extern</span><span style="COLOR: #000000"> ssize_t recv (</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> __fd, </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">__buf, size_t __n, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> __flags);</span></div> 榪欎袱涓嚱鏁扮殑絎竴涓弬鏁版槸鐢ㄤ簬“閫氳”鐨剆ocket錛岀浜屼釜鍙傛暟鏄彂閫佹垨鑰呮帴鏀舵暟鎹殑璧峰鐐規寚閽堬紝絎笁涓弬鏁版槸鏁版嵁闀垮害錛岀鍥涗釜鍙傛暟鏄帶鍒剁鍙鳳紙榛樿灞炴ц緗負0灝卞彲浠ヤ簡錛夈傚け璐ユ椂鍊欎紶鍥?1錛屽惁鍒欎紶鍥炲疄闄呭彂閫佹垨鑰呮帴鏀舵暟鎹殑澶у皬錛岃繑鍥?寰寰鎰忓懗鐫榪炴帴鏂紑浜嗐?br><br>澶勭悊echo琛屼負<br> <div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><!--<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"> TcpServer::handleEcho()<br>{<br>    </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> BUFFERSIZE </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">32</span><span style="COLOR: #000000">;<br>    </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> buffer[BUFFERSIZE];<br>    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> recvMsgSize;<br>    </span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000"> goon </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br><br>    </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000"> ( goon </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000"> ) {<br>        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> ( (recvMsgSize </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> recv(communicationSock, buffer, BUFFERSIZE, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)) </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> ) {<br>            </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">recv() failed</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>        } </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> ( recvMsgSize </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> ) {<br>            goon </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br>        } </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"> {<br>            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> ( send(communicationSock, buffer, recvMsgSize, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">) </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> recvMsgSize ) {<br>                </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">send() failed</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>            }<br>        }<br>    }<br><br>    close(communicationSock);<br>}</span></div> 鏈皬鑺傛渶鍚庤璁茬殑鍑芥暟鏄痗lose()錛屽畠鍖呭惈鍦?lt;unistd.h>涓?br> <div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">unistd.h</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> Close the file descriptor FD.<br><br>   This function is a cancellation point and therefore not marked with<br>   __THROW.  </span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">extern</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> close (</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> __fd);</span></div> 榪欎釜鍑芥暟鐢ㄤ簬鍏抽棴涓涓枃浠舵弿榪扮錛岃嚜鐒訛紝涔熷氨鍙互鐢ㄤ簬鍏抽棴socket銆?br>涓嬩竴灝忚妭鏄畬鏁寸殑婧愪唬鐮併傞粯璁ょ殑鐩戝惉绔彛鏄?000銆傛垜浠彲浠ラ氳繃<br>$telnet 127.0.0.1 5000<br>楠岃瘉鍦ㄦ湰鏈鴻繍琛岀殑echo server紼嬪簭銆?br> <img src ="http://m.shnenglu.com/lf426/aggbug/56279.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/lf426/" target="_blank">lf426</a> 2008-07-16 12:26 <a href="http://m.shnenglu.com/lf426/archive/2008/07/16/56279.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>socket 緙栫▼鍏ラ棬鏁欑▼錛堜竴錛塗CP server 绔細6銆佸垱寤衡滈氳 鈥濆祵濂楀瓧http://m.shnenglu.com/lf426/archive/2008/07/15/56180.htmllf426lf426Tue, 15 Jul 2008 05:04:00 GMThttp://m.shnenglu.com/lf426/archive/2008/07/15/56180.htmlhttp://m.shnenglu.com/lf426/comments/56180.htmlhttp://m.shnenglu.com/lf426/archive/2008/07/15/56180.html#Feedback0http://m.shnenglu.com/lf426/comments/commentRss/56180.htmlhttp://m.shnenglu.com/lf426/services/trackbacks/56180.html
        榪欓噷鐨?#8220;閫氳”鍔犱笂浜嗗紩鍙鳳紝鏄洜涓哄疄闄呬笂鎵鏈夌殑socket閮芥湁閫氳鐨勫姛鑳斤紝鍙槸鍦ㄦ垜浠殑渚嬪瓙涓紝涔嬪墠閭d釜socket鍙礋璐isten錛岃岃繖涓猻ocket璐熻矗鎺ュ彈淇℃伅騫秂cho鍥炲幓銆?br> 鎴戜滑鐜扮湅鐪嬭繖涓嚱鏁幫細
bool TcpServer::isAccept()
{
    unsigned 
int clntAddrLen = sizeof(clntAddr);

    
if ( (communicationSock = accept(listenSock, (sockaddr*)&clntAddr, &clntAddrLen)) < 0 ) {
        
return false;
    } 
else {
        std::cout 
<< "Client(IP: " << inet_ntoa(clntAddr.sin_addr) << ") connected.\n";
        
return true;
    }
}

鐢╝ccept()鍒涘緩鏂扮殑socket

        鍦ㄦ垜浠殑渚嬪瓙涓紝communicationSock瀹為檯涓婃槸鐢ㄥ嚱鏁癮ccept()鍒涘緩鐨勩?br>
int accept(int socket, struct sockaddr* clientAddress, unsigned int* addressLength);
鍦↙inux涓殑瀹炵幇涓猴細
/* Await a connection on socket FD.
   When a connection arrives, open a new socket to communicate with it,
   set *ADDR (which is *ADDR_LEN bytes long) to the address of the connecting
   peer and *ADDR_LEN to the address's actual length, and return the
   new socket's descriptor, or -1 for errors.

   This function is a cancellation point and therefore not marked with
   __THROW.  
*/
extern int accept (int __fd, __SOCKADDR_ARG __addr,
           socklen_t 
*__restrict __addr_len);
榪欎釜鍑芥暟瀹為檯涓婅搗鐫鏋勯爏ocket浣滅敤鐨勪粎浠呭彧鏈夌涓涓弬鏁幫紙鍙﹀榪樻湁涓涓笉鍦ㄨ繖涓嚱鏁板唴琛ㄧ幇鍑烘潵鐨勫洜绱狅紝鍚庨潰浼氳璁哄埌錛夛紝鍚庨潰涓や釜鎸囬拡閮芥湁鍓綔鐢紝鍦╯ocket鍒涘緩鍚庯紝浼氬皢瀹㈡埛绔痵ockaddr鐨勬暟鎹互鍙婄粨鏋勪綋鐨勫ぇ灝忎紶鍥炪?br>        褰撶▼搴忚皟鐢╝ccept()鐨勬椂鍊欙紝紼嬪簭鏈夊彲鑳藉氨鍋滀笅鏉ョ瓑accept()鐨勭粨鏋溿傝繖灝辨槸鎴戜滑鍓嶄竴灝忚妭璇村埌鐨刡lock錛堥樆濉烇級銆傝繖濡傚悓鎴戜滑璋冪敤std::cin鐨勬椂鍊欑郴緇熶細絳夊緟杈撳叆鐩村埌鍥炶濺涓鏍楓俛ccept()鏄竴涓湁鍙兘寮曡搗block鐨勫嚱鏁般傝娉ㄦ剰鎴戣鐨勬槸“鏈夊彲鑳?#8221;錛岃繖鏄洜涓篴ccept()鐨刡lock涓庡惁瀹為檯涓婂喅瀹氫笌絎竴涓弬鏁皊ocket鐨勫睘鎬с傝繖涓枃浠舵弿榪扮濡傛灉鏄痓lock鐨勶紝accept()灝眀lock錛屽惁鍒欏氨涓峛lock銆傞粯璁ゆ儏鍐典笅錛宻ocket鐨勫睘鎬ф槸“鍙鍙啓”錛屽茍涓旓紝鏄樆濉炵殑銆傛墍浠ワ紝鎴戜滑涓嶄慨鏀箂ocket灞炴х殑鏃跺欙紝accept()鏄樆濉炵殑銆?br>
accept()鐨勫彟涓闈onnect()

        accept()鍙槸鍦╯erver绔鍔ㄧ殑絳夊緟錛屽畠鎵鍝嶅簲鐨勶紝鏄痗lient绔痗onnect()鍑芥暟錛?br>
int connect(int socket, struct sockaddr* foreignAddress, unsigned int addressLength);
铏界劧鎴戜滑榪欓噷涓嶆墦綆楄緇嗚鏄庤繖涓猚lient绔殑鍑芥暟錛屼絾鏄垜浠彲浠ョ湅鍑烘潵錛岃繖涓嚱鏁頒笌涔嬪墠鎴戜滑浠嬬粛鐨刡ind()鏈夊嚑鍒嗙浉浼鹼紝鐗瑰埆鍦↙inux鐨勫疄鐜頒腑錛?br>
/* Open a connection on socket FD to peer at ADDR (which LEN bytes long).
   For connectionless socket types, just set the default address to send to
   and the only address from which to accept transmissions.
   Return 0 on success, -1 for errors.

   This function is a cancellation point and therefore not marked with
   __THROW.  
*/
extern int connect (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len);
connect() 涔熶嬌鐢ㄤ簡const鐨剆ockaddr錛屽彧涓嶈繃鏄繙紼嬬數鑴戜笂鐨勮岄潪bind()鐨勬湰鏈恒?br>        accept()鍦╯erver绔〃闈笂鏄氳繃listen socket鍒涘緩浜嗘柊鐨剆ocket錛屽疄闄呬笂錛岃繖縐嶈涓烘槸鍦ㄦ帴鍙楀鏂瑰鎴鋒満紼嬪簭涓璫onnect()鍑芥暟鐨勮姹傚悗鍙戠敓鐨勩傜患鍚堣搗鐪嬶紝琚垱寤虹殑鏂皊ocket瀹為檯涓婂寘鍚簡listen socket鐨勪俊鎭互鍙婂鎴風connect()璇鋒眰涓墍鍖呭惈鐨勪俊鎭斺斿鎴風鐨剆ockaddr鍦板潃銆?br>
鏂皊ocket涓巗ockaddr鐨勫叧緋?br>
        accept()鍒涘緩鐨勬柊socket錛堟垜浠緥瀛愪腑鐨刢ommunicationSock錛岃繖閲屾垜浠畝鍗曠敤newSock鏉ュ甫鎸囷級棣栧厛鍖呭惈浜唋isten socket鐨勪俊鎭紝鎵浠ワ紝newSock鍏鋒湁鏈満sockaddr鐨勪俊鎭紱鍏舵錛屽洜涓哄畠鍝嶅簲浜巆lient绔痗onnect()鍑芥暟鐨勮姹傦紝鎵浠ワ紝瀹冭繕鍖呭惈浜哻linet绔痵ockaddr鐨勪俊鎭?br>        鎴戜滑璇磋繃錛宻tream嫻佸艦寮忕殑TCP鍗忚瀹為檯涓婃槸寤虹珛璧蜂竴涓?#8220;鍙潵鍙幓”鐨勯氶亾銆傜敤浜巐isten鐨勯氶亾錛岃繙紼嬫満鐨勭洰鏍囧湴鍧鏄笉紜畾鐨勶紱浣嗘槸newSock鍗存槸鏈夋寚瀹氱殑鏈満鍦板潃鍜岃繙紼嬫満鍦板潃錛屾墍浠ワ紝榪欎釜socket錛屾墠鏄垜浠湡姝g敤浜嶵CP“閫氳”鐨剆ocket銆?br>
inet_ntoa()
#include <arpa/inet.h>

/* Convert Internet number in IN to ASCII representation.  The return value
   is a pointer to an internal array containing the string.  
*/
extern char *inet_ntoa (struct in_addr __in) __THROW;
        瀵逛簬榪欎釜鍑芥暟錛屾垜浠彲浠ヤ綔涓轟竴縐嶏紝灝咺P鍦板潃錛岀敱in_addr緇撴瀯杞崲涓哄彲璇葷殑ASCII褰㈠紡鐨勫浐瀹氱敤娉曘?br>


lf426 2008-07-15 13:04 鍙戣〃璇勮
]]>
socket 緙栫▼鍏ラ棬鏁欑▼錛堜竴錛塗CP server 绔細5銆佸垱寤虹洃鍚祵濂楀瓧http://m.shnenglu.com/lf426/archive/2008/07/14/56092.htmllf426lf426Mon, 14 Jul 2008 05:02:00 GMThttp://m.shnenglu.com/lf426/archive/2008/07/14/56092.htmlhttp://m.shnenglu.com/lf426/comments/56092.htmlhttp://m.shnenglu.com/lf426/archive/2008/07/14/56092.html#Feedback1http://m.shnenglu.com/lf426/comments/commentRss/56092.htmlhttp://m.shnenglu.com/lf426/services/trackbacks/56092.html
        鍓嶉潰涓灝忚妭錛屾垜浠凡緇忓啓鍑轟簡TcpServer鐨勬瀯閫犲嚱鏁般傝繖涓嚱鏁扮殑瀹為檯浣滅敤錛屽氨鏄垱寤轟簡listen socket錛堢洃鍚祵濂楀瓧錛夈傝繖涓鑺傦紝鎴戜滑鏉ュ叿浣撳垎鏋愯繖涓垱寤虹殑榪囩▼銆?br>
socket鍜宻ockaddr鐨勫垱寤烘槸鍙互鐩鎬簰鐙珛鐨?br>
        鍦ㄥ嚱鏁頒腑錛屾垜浠鍏堥氳繃socket()緋葷粺璋冪敤鍒涘緩浜唋istenSock錛岀劧鍚庨氳繃涓虹粨鏋勪綋璧嬪肩殑鏂規硶鍏蜂綋瀹氫箟浜嗘湇鍔″櫒绔殑sockaddr銆傦紙memset()鍑芥暟鐨勪綔鐢ㄦ槸鎶婃煇涓唴瀛樻鐨勭┖闂磋瀹氫負鏌愬鹼紝榪欓噷鏄竻闆躲傦級鍏朵粬鐨勬蹇靛凡緇忓湪鍓嶄竴灝忚妭璁插畬浜嗐傝繖閲岄渶瑕佽ˉ鍏呯殑鏄鏄庡畯瀹氫箟INADDR_ANY銆傝繖閲岀殑鎰忔濇槸浣跨敤鏈満鎵鏈夊彲鐢ㄧ殑IP鍦板潃銆傚綋鐒訛紝濡傛灉浣犳満鍣ㄧ粦瀹氫簡澶氫釜IP鍦板潃錛屼綘涔熷彲浠ユ寚瀹氫嬌鐢ㄥ摢涓涓?br>
鏁版嵁嫻佺畝鏄撴ā鍨嬶紙SOCK_STREAM錛?br>
        鎴戜滑鐨勪緥瀛愪互鐢佃瘽鍋氱殑姣斿柣錛屽疄闄呬笂錛宻ocket stream妯″瀷涓嶅畬鍏ㄧ被浼肩數璇濓紝瀹冭嚦灝戞湁浠ヤ笅榪欎簺鐗圭偣錛?br>1銆佷竴縐嶆寔緇х殑榪炴帴銆傝繖鐐硅窡鐢佃瘽鏄被浼肩殑錛屼篃鍙互鎯寵薄鎴愭祦鍔ㄧ潃娑蹭綋鐨勬按綆°備竴鏃︽柇寮錛岃繖縐嶆祦鍔ㄥ氨浼氫腑鏂?br>2銆佹暟鎹寘鐨勫彂閫佸疄闄呬笂鏄潪榪炵畫鐨勩傝繖涓笘鐣屼笂鏈変粈涔堜簨鐗╂槸鐪熸鐨勭嚎鎬ц繛緇殑錛熷懙鍛碉紝鎵繙浜嗭紝榪欒矊浼間竴涓摬瀛﹂棶棰樸傛垜浠粎浠呴渶瑕佺煡閬撶殑鏄紝涓涓暟鎹寘涓嶅彲鑳芥槸鏃犻檺澶х殑錛屾墍浠ワ紝鎬繪槸涓涓皬鏁版嵁鍖呬竴涓皬鏁版嵁鍖呰繖鏍風殑鍙戦佺殑銆傝繖涓鐐癸紝鍙堟湁鐐瑰儚閭寘鐨勪紶閫掋傝繖浜涙暟鎹寘鍒拌揪涓庡惁錛屽埌杈劇殑鍏堝悗嬈″簭鏈韓鏄棤娉曚繚璇佺殑錛屽嵆鏄錛屾槸IP鍗忚鏃犳硶淇濊瘉鐨勩備絾鏄痵tream褰㈠紡鐨凾CP鍗忚錛屽湪IP涔嬩笂錛屽仛浜嗕竴瀹氬埌杈懼拰鍒拌揪欏哄簭鐨勪繚璇併?br>3銆佷紶閫佺閬撳疄闄呬笂鏄潪灝侀棴鐨勩傝涓嶅共鍢涘彨“緗戠粶”-_-!!!銆傛垜浠箣鎵浠ヨ兘淇濊瘉鏁版嵁鍖呯殑“瀹氱偣”浼犻侊紝瀹屽叏鏄緷闈犳瘡涓暟鎹寘閮借嚜甯︿簡鐩殑鍦板潃淇℃伅銆?br>        鐢辨鍙錛岃櫧鐒秙ocket鍜宻ockaddr鍙互鍒嗗埆鍒涘緩錛屽茍鏃犱緷璧栧叧緋匯備絾鏄湪瀹為檯浣跨敤鐨勬椂鍊欙紝涓涓猻ocket鑷沖皯浼氱粦瀹氫竴涓湰鏈虹殑sockaddr錛屾病鏈夎嚜宸辯殑“鍦板潃淇℃伅”錛屽氨涓嶈兘鎺ュ彈鍒扮綉緇滀笂鐨勬暟鎹寘錛堣嚦灝戝湪TCP鍗忚閲岄潰鏄繖鏍風殑錛夈?br>
socket涓庢湰鏈簊ockaddr鐨勭粦瀹?br>
        鏈夋椂鍊欑粦瀹氭槸緋葷粺鐨勪換鍔★紝鐗瑰埆鏄綋浣犱笉闇瑕佺煡閬撹嚜宸辯殑IP鍦板潃鍜屾墍浣跨敤鐨勭鍙e彿鐨勬椂鍊欍備絾鏄紝鎴戜滑鐜板湪鏄緩绔嬫湇鍔″櫒錛屼綘蹇呴』鍛婅瘔瀹㈡埛绔綘鐨勮繛鎺ヤ俊鎭細IP鍜孭ort銆傛墍浠ワ紝鎴戜滑闇瑕佹寚鏄嶪P鍜孭ort錛岀劧鍚庤繘琛岀粦瀹氥?br>
int bind(int socket, struct sockaddr* localAddress, unsigned int addressLength);
浣滀負C++鐨勭▼搴忓憳錛屼篃璁鎬綘浼氳寰楄繖涓嚱鏁板緢涓嶅弸濂斤紝瀹冧技涔庢洿搴旇鍐欐垚錛?br>
int bind_cpp_style(int socket, const sockaddr& localAddress);
鎴戜滑闇瑕侀氳繃鍑芥暟鍘熷瀷鎸囨槑涓ょ偣錛?br>1銆佹垜浠粎浠呬嬌鐢╯ockaddr緇撴瀯鐨勬暟鎹紝浣嗗茍涓嶄細瀵瑰師鏈夌殑鏁版嵁榪涜淇敼錛?br>2銆佹垜浠嬌鐢ㄧ殑鏄畬鏁寸殑緇撴瀯浣擄紝鑰屼笉浠呬粎鏄繖涓粨鏋勪綋鐨勬寚閽堛傦紙寰堟樉鐒跺厜鐢ㄦ寚閽堟槸鏃犳硶璇存槑緇撴瀯浣撳ぇ灝忕殑錛?br>騫歌繍鐨勬槸錛屽湪Linux鐨勫疄鐜頒腑錛岃繖涓嚱鏁板凡緇忚鍐欎負錛?br>
#include <sys/socket.h>

/* Give the socket FD the local address ADDR (which is LEN bytes long).  */
extern int bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len)
     __THROW;
鐪嬪埌浜插垏鐨刢onst錛屾垜浠氨鐭ラ亾榪欎釜鎸囬拡甯﹀叆鏄病鏈?#8220;鍓綔鐢?#8221;鐨勩?br>
鐩戝惉錛歭isten()

        stream嫻佹ā鍨嬪艦寮忎笂鏄竴縐?#8220;鎸佺畫鎬?#8221;鐨勮繛鎺ワ紝榪欏氨鏄姹備俊鎭殑嫻佸姩鏄?#8220;鍙潵鍙幓”鐨勩備篃灝辨槸璇達紝stream嫻佺殑socket闄や簡緇戝畾鏈満鐨剆ockaddr錛岃繕搴旇鎷ユ湁瀵規柟sockaddr鐨勪俊鎭傚湪listen()涓紝榪?#8220;瀵規柟鐨剆ockaddr”灝卞彲浠ヤ笉鏄煇涓涓壒瀹氱殑sockaddr銆傚疄闄呬笂錛宭isten socket鐨勭洰鐨勬槸鍑嗗琚姩鐨勬帴鍙楁潵鑷?#8220;鎵鏈?#8221;sockaddr鐨勮姹傘傛墍浠ワ紝listen()鍙嶈屽氨涓嶈兘鎸囧畾鏌愪釜鐗瑰畾鐨剆ockaddr銆?br>
int listen(int socket, int queueLimit);
鍏朵腑絎簩涓弬鏁版槸絳夊緟闃熷垪鐨勯檺鍒訛紝涓鑸緗湪5-20銆侺inux涓疄鐜頒負錛?br>
#include <sys/socket.h>

/* Prepare to accept connections on socket FD.
   N connection requests will be queued before further requests are refused.
   Returns 0 on success, -1 for errors.  
*/
extern int listen (int __fd, int __n) __THROW;
瀹屾垚浜嗚繖涓姝ワ紝鍥炲埌鎴戜滑鐨勪緥瀛愶紝灝卞儚鏄浣犲皬寮熷湪鐢佃瘽鏈哄墠鍋氬ソ浜嗘帴鐢佃瘽鐨勫噯澶囧伐浣溿傞渶瑕佸啀嬈″己璋冪殑鏄紝榪欎簺琛屼負浠呬粎鏄敼鍙樹簡socket鐨勭姸鎬侊紝瀹為檯涓婃垜鎯沖己璋冪殑鏄紝涓轟粈涔堣繖浜涘嚱鏁頒笉浼氶犳垚block錛堥樆濉烇級鐨勫師鍥犮傦紙block鐨勬蹇典互鍚庡啀瑙i噴錛?br>


lf426 2008-07-14 13:02 鍙戣〃璇勮
]]>
socket 緙栫▼鍏ラ棬鏁欑▼錛堜竴錛塗CP server 绔細4銆佹瀯閫犲嚱鏁版秹鍙婄殑姒傚康http://m.shnenglu.com/lf426/archive/2008/07/12/55956.htmllf426lf426Sat, 12 Jul 2008 05:27:00 GMThttp://m.shnenglu.com/lf426/archive/2008/07/12/55956.htmlhttp://m.shnenglu.com/lf426/comments/55956.htmlhttp://m.shnenglu.com/lf426/archive/2008/07/12/55956.html#Feedback0http://m.shnenglu.com/lf426/comments/commentRss/55956.htmlhttp://m.shnenglu.com/lf426/services/trackbacks/55956.html
        璇濋鍥炲埌“榛戠ぞ浼氬姙鍏”鐨勪緥瀛愶紝璁叉蹇靛凡緇忔壇寰楁瘮杈冭繙浜嗭紝涓嶈繃錛岃繖涓鑺傛垜浠繕寰楄姒傚康錛屼笉榪囧ソ鍦ㄦ湁浜涚▼搴忕殑渚嬪瓙銆傚鏋滃ぇ瀹朵笉鎯崇炕鍥炲幓鐪婽cpServer綾葷殑鍘熷瀷錛屾垜榪欓噷鐩存帴緇欏嚭榪欎釜澶存枃浠剁殑瀹屾暣婧愪唬鐮侊細
//Filename: TcpServerClass.hpp

#ifndef TCPSERVERCLASS_HPP_INCLUDED
#define TCPSERVERCLASS_HPP_INCLUDED

#include 
<unistd.h>
#include 
<iostream>
#include 
<sys/socket.h>
#include 
<arpa/inet.h>

class TcpServer
{
private:
    
int listenSock;
    
int communicationSock;
    sockaddr_in servAddr;
    sockaddr_in clntAddr;
public:
    TcpServer(
int listen_port);
    
bool isAccept();
    
void handleEcho();
};


#endif // TCPSERVERCLASS_HPP_INCLUDED
鎴戜滑宸茬粡瑙i噴浜嗕負浠涔坙istenSock鍜宑ommunicationSock鐨勭被鍨嬫槸int錛屼互鍙妔ockaddr_in鏄粈涔堢粨鏋勶紝鐜板湪鏉ュ啓榪欎釜綾葷殑鏋勯犲嚱鏁幫細
TcpServer::TcpServer(int listen_port)
{
    
if ( (listenSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0 ) {
        
throw "socket() failed";
    }

    memset(
&servAddr, 0sizeof(servAddr));
    servAddr.sin_family 
= AF_INET;
    servAddr.sin_addr.s_addr 
= htonl(INADDR_ANY);
    servAddr.sin_port 
= htons(listen_port);

    
if ( bind(listenSock, (sockaddr*)&servAddr, sizeof(servAddr)) < 0 ) {
        
throw "bind() failed";
    }

    
if ( listen(listenSock, 10< 0 ) {
        
throw "listen() failed";
    }
}
濂斤紝鍏堢湅鐪嬬▼搴忓煿鍏諱竴涓嬫劅瑙夛紝鎴戜滑榪樺緱璇存蹇點?br>
鏁版嵁灝佽錛圖ata Encapsutation錛?br>
        鎴戜滑鍓嶉潰璇村埌浜嗙綉緇滃垎灞傦細閾捐礬鈥斺旂綉緇溾斺斾紶杈撯斺斿簲鐢ㄣ傛暟鎹粠搴旂敤紼嬪簭閲岃癁鐢燂紝浼犻佸埌浜掕仈緗戜笂姣忎竴灞傞兘浼氳繘琛屼竴嬈″皝瑁咃細
Data>>Application>>TCP/UDP>>IP>>OS(Driver, Kernel & Physical Address)
鎴戜滑鐢╯ocket閲嶇偣鎻忚堪鐨勬槸鍗忚錛屽寘鎷綉緇滃崗璁紙IP錛夊拰浼犺緭鍗忚錛圱CP/UDP錛夈?br>sockaddr閲嶇偣鎻忚堪鐨勬槸鍦板潃錛屽寘鎷琁P鍦板潃鍜孴CP/UDP绔彛銆?br>
socket()鍑芥暟

    鎴戜滑浠嶵cpServer::TcpServer()鍑芥暟鍙互鐪嬪埌錛宻ocket鍜宻ockaddr鐨勪駭鐢熸槸鍙互鐩鎬簰鐙珛鐨勩俿ocket()鐨勫嚱鏁板師鍨嬫槸錛?br>
int socket(int protocolFamily, int type, int protocol);
鍦↙inux涓殑瀹炵幇涓猴細
#include <sys/socket.h>

/* Create a new socket of type TYPE in domain DOMAIN, using
   protocol PROTOCOL.  If PROTOCOL is zero, one is chosen automatically.
   Returns a file descriptor for the new socket, or -1 for errors.  
*/
extern int socket (int __domain, int __type, int __protocol) __THROW;
絎竴涓弬鏁版槸鍗忚綈囷紙Linux閲岄潰鍙綔鍩燂紝鎰忔濅竴鏍風殑錛夛紝榪樻槸閭e彞璇濓紝鎴戜滑榪欑瘒鏁欑▼鐢ㄥ埌鐨勫氨浠呬粎鏄竴涓狿F_INET錛坧rotocol family : internet錛夛紝寰堝鏃跺欎綘浼氬彂鐜頒漢浠篃緇忓父鍦ㄨ繖閲岃祴鍊間負AF_INET錛屼簨瀹炰笂錛屽綋鍓嶏紝AF_INET灝辨槸PF_INET鐨勪竴涓?define錛屼絾鏄紝鍐欐垚PF_INET浠庤涔変笂浼氭洿鍔犱弗璋ㄣ傝繖涔熷氨鏄疶CP/IP鍗忚綈囦腑鐨処P鍗忚錛圛nternet Protocol錛夛紝緗戠粶灞傜殑鍗忚銆?br>鍚庨潰涓や釜鍙傛暟瀹氫箟浼犺緭灞傜殑鍗忚銆?br>絎簩涓弬鏁版槸浼犺緭灞傚崗璁被鍨嬶紝鎴戜滑鏁欑▼閲岀敤鍒扮殑瀹忥紝鍙湁涓や釜錛歋OCK_STREAM錛堟暟鎹祦鏍煎紡錛夊拰SOCK_DGRAM錛堟暟鎹姤鏍煎紡錛夛紱錛堝叿浣撴槸浠涔堟垜浠互鍚庤璁猴級
絎笁涓弬鏁版槸鍏蜂綋鐨勪紶杈撳眰鍗忚銆傚綋璧嬪間負0鐨勬椂鍊欙紝緋葷粺浼氭牴鎹紶杈撳眰鍗忚綾誨瀷鑷姩鍖歸厤鍜岄夋嫨銆備簨瀹炰笂錛屽綋鍓嶏紝鍖歸厤SOCK_STREAM鐨勫氨鏄疶CP鍗忚錛涜屽尮閰峉OCK_DGRAM灝辨槸UDP鍗忚銆傛墍浠ワ紝鎴戜滑鎸囧畾浜嗙浜屼釜鍙傛暟錛岀涓変釜灝卞彲浠ョ畝鍗曠殑璁劇疆涓?銆備笉榪囷紝涓轟簡涓ヨ皚錛屾垜浠渶濂借繕鏄妸鍏蜂綋鍗忚鍐欏嚭鏉ワ紝姣斿錛屾垜浠殑渚嬪瓙涓殑TCP鍗忚鐨勫畯鍚嶇О錛欼PPROTO_TCP銆?br>
鏁版嵁鐨?#8220;鍦板潃”

        浠庢暟鎹皝瑁呯殑妯″瀷錛屾垜浠彲浠ョ湅鍒版暟鎹槸鎬庝箞浠庡簲鐢ㄧ▼搴忎紶閫掑埌浜掕仈緗戠殑銆傛垜浠榪囷紝鏁版嵁鐨勪紶閫佹槸閫氳繃socket榪涜鐨勩備絾鏄痵ocket鍙弿榪頒簡鍗忚綾誨瀷銆傝璁╂暟鎹紜殑浼犻佸埌鏌愪釜鍦版柟錛屽繀欏繪坊鍔犻偅涓湴鏂圭殑sockaddr鍦板潃錛涘悓鏍鳳紝瑕佽兘鎺ュ彈緗戠粶涓婄殑鏁版嵁錛屽繀欏繪湁鑷繁鐨剆ockaddr鍦板潃銆?br>        鍙錛屽湪緗戠粶涓婁紶閫佺殑鏁版嵁鍖咃紝鏄痵ocket鍜宻ockaddr鍏卞悓“鏌撴寚”鐨勭粨鏋溿備粬浠叡鍚屽皝瑁呭拰鎸囧畾浜嗕竴涓暟鎹寘鐨勭綉緇滃崗璁紙IP錛夊拰IP鍦板潃錛屼紶杈撳崗璁紙TCP/UDP錛夊拰绔彛鍙楓?br>
緗戠粶瀛楄妭鍜屾湰鏈哄瓧鑺傜殑鐩鎬簰杞崲

        sockaddr緇撴瀯涓殑IP鍦板潃錛坰in_addr.s_addr錛夊拰绔彛鍙鳳紙sin_port錛夊皢琚皝瑁呭埌緗戠粶涓婁紶閫佺殑鏁版嵁鍖呬腑錛屾墍浠ワ紝瀹冪殑緇撴瀯褰㈠紡闇瑕佷繚璇佹槸緗戠粶瀛楄妭褰㈠紡銆傛垜浠繖閲岀敤鍒扮殑鍑芥暟鏄痟tons()鍜宧tonl()錛岃繖浜涚緝鍐欑殑鎰忔濇槸錛?br>h: host錛屼富鏈猴紙鏈満錛?br>n: network錛岀綉緇?br>to: to杞崲
s: short錛?6浣嶏紙2瀛楄妭錛屽父鐢ㄤ簬绔彛鍙鳳級
l: long, 32浣嶏紙4瀛楄妭錛屽父鐢ㄤ簬IP鍦板潃錛?br>“鍙嶈繃鏉?#8221;鐨勫嚱鏁頒篃鏄瓨鍦ㄧ殑ntohs()鍜宯tohl()銆?br>
鍔ㄤ綔涓庢寔緇涓?br>
        鏈妭鏈鍚庣殑涓涓蹇靛彲浠ヨ窡璁$畻鏈烘棤鍏熾備綔涓哄姩璇嶏紝鏈変簺鍙互鎻忚堪鍔ㄤ綔錛屾湁浜涙槸鎻忚堪涓閲嶆寔緇殑琛屼負鐘舵佺殑錛堝氨濡傚悓涓鑸姩璇嶅拰be鍔ㄨ瘝涓鏍鳳級銆傛壇鍒癈++鏉ヨ錛屾垜浠彲浠ユ妸鎸佺畫琛屼負灝佽鍒板嚱鏁板唴閮紝鍙暀鍑哄姩浣滅殑鎺ュ彛銆備簨瀹炰笂錛屾瀯閫犲嚱鏁頒腑鐨刡ind()鍜宭isten()灝辨槸榪欑鎻忚堪鎸佺畫鐘舵佺殑琛屼負鍑芥暟銆?br>


lf426 2008-07-12 13:27 鍙戣〃璇勮
]]>
socket 緙栫▼鍏ラ棬鏁欑▼錛堜竴錛塗CP server 绔細3銆乻ockaddr涓巗ockaddr_inhttp://m.shnenglu.com/lf426/archive/2008/07/10/55800.htmllf426lf426Thu, 10 Jul 2008 07:14:00 GMThttp://m.shnenglu.com/lf426/archive/2008/07/10/55800.htmlhttp://m.shnenglu.com/lf426/comments/55800.htmlhttp://m.shnenglu.com/lf426/archive/2008/07/10/55800.html#Feedback2http://m.shnenglu.com/lf426/comments/commentRss/55800.htmlhttp://m.shnenglu.com/lf426/services/trackbacks/55800.html
鏀朵歡浜哄湴鍧

        涓瀹跺寲濡嗗搧鍏徃灝嗕竴鎵規柊浜у搧鐨勬牱鍝侊紝鍑嗗鍙戠粰鏌愬鏍℃煇涓彮鐨勫コ鐢熶滑鍏嶈垂璇曠敤銆傞氬父鎯呭喌涓嬶紝榪欎歡閭寘鐨勫湴鍧涓婂彲浠ヨ繖涔堝啓錛?br>
鏀朵歡浜猴細鍏ㄤ綋濂崇敓銆?br>鍦板潃錛欰鐪丅甯侰瀛︽牎錛孹綰鐝?/span>
浣嗘槸錛屽鏋滃湪鎻忚堪鍦板潃鐨勬椂鍊欒繖鏍峰啓鍛細
鏀朵歡浜猴細鍏ㄤ綋濂崇敓銆?br>鍦板潃錛氳鎵撶數璇漻xxxxxxx錛屾壘浠栦滑瀛︽牎涓涓彨Lucy鐨勫コ鐢燂紝鐒跺悗鎶婁笢瑗塊佸埌濂圭殑鐝笂銆?/span>
榪欑鏂囧瓧鏄浉褰撶殑璇″紓鍟?_-!!!錛屼絾鏄茍涓嶇瓑浜庡氨娌℃湁琛ㄨ堪娓呮閭寘鐨勫幓鍚戝拰鍦板潃銆備簨瀹炰笂閭眬鐪嬪埌榪欐牱鐨勫湴鍧涓瀹氫細鍙戦鐨勶紝鐒惰屽浜庣數鑴戯紝濡傛灉浣犵殑鍦板潃鎻忚堪褰㈠紡鏄粬鍙互鎺ュ彈鍜屾墽琛岀殑錛屼粬灝變細鑰佽佸疄瀹炵殑鎸変綘鐨勮姹傚幓鍋?#8230;…
        鎵浠ワ紝濡備綍鎻忚堪鍦板潃涓嶆槸闂鐨勫叧閿紝鍏抽敭鍦ㄤ簬榪欐牱鐨勮〃榪版槸涓嶆槸鑳藉琛ㄨ堪娓呮涓涓湴鍧銆備竴縐嶆洿鍔犻氱敤鐨勮〃杈懼艦寮忓彲鑳芥槸榪欐牱鐨勶細
鏀朵歡浜猴細鍏ㄤ綋濂崇敓銆?br>鍦板潃錛?/span><涓縐嶅湴鍧鎻忚堪鏂瑰紡>
        浜嬪疄涓婏紝鍦╯ocket鐨勯氱敤address鎻忚堪緇撴瀯sockaddr涓鏄敤榪欐牱鐨勬柟寮忔潵榪涜鍦板潃鎻忚堪鐨勶細
struct sockaddr
{
    unsigned 
short sa_family;
    
char sa_data[14];
};
榪欐槸涓涓?6瀛楄妭澶у皬鐨勭粨鏋勶紙2+14錛夛紝sa_family鍙互璁や負鏄痵ocket address family鐨勭緝鍐欙紝涔熷彲鑳借綆鍐欐垚AF錛圓ddress Family錛夛紝浠栧氨濂藉儚鎴戜滑渚嬪瓙涓偅涓?#8220;鏀朵歡浜猴細鍏ㄤ綋濂崇敓”涓鏍鳳紝铏界劧浜嬪疄涓婃湁寰堝AF鐨勭綾伙紝浣嗘槸鎴戜滑榪欎釜鏁欑▼涓彧鐢ㄥ緱涓婂ぇ鍚嶉紟榧庣殑internet瀹舵棌AF_INET銆傚彟澶栫殑14瀛楄妭鏄敤鏉ユ弿榪板湴鍧鐨勩傝繖鏄竴縐嶉氱敤緇撴瀯錛屼簨瀹炰笂錛屽綋鎴戜滑鎸囧畾sa_family=AF_INET涔嬪悗錛宻a_data鐨勫艦寮忎篃灝辮鍥哄畾浜嗕笅鏉ワ細鏈鍓嶇鐨?瀛楄妭鐢ㄤ簬璁板綍16浣嶇殑绔彛錛岀揣鎺ョ潃鐨?瀛楄妭鐢ㄤ簬璁板綍32浣嶇殑IP鍦板潃錛屾渶鍚庣殑8瀛楄妭娓呯┖涓洪浂銆傝繖灝辨槸鎴戜滑瀹為檯鍦ㄦ瀯閫爏ockaddr鏃跺欑敤鍒扮殑緇撴瀯sockaddr_in錛堟剰鎸噑ocket address internet錛夛細
struct sockaddr_in
{
    unsigned 
short sin_family;
    unsigned 
short sin_port;
    
struct in_addr sin_addr;
    
char sin_zero[8];
};
鎴戞兂錛宻in_鐨勬剰鎬濓紝灝辨槸socket (address) internet鍚э紝鍙笉榪囨妸address鐪佺暐鎺変簡銆俿in_addr琚畾涔夋垚浜嗕竴涓粨鏋勶紝榪欎釜緇撴瀯瀹為檯涓婂氨鏄細
struct in_addr
{
    unsigned 
long s_addr;
};
in_addr鏄劇劧鏄痠nternet address浜嗭紝s_addr鏄粈涔堟剰鎬濆憿錛熻瀹炶瘽鎴戞病鐚滃嚭鍊煎緱鑲畾鐨勭瓟妗堬紙鏍規嵁涓嬮潰緗戝弸鐨勮瘎璁猴紝鍏舵剰鎬濅負source address錛岃阿璋級錛屼篃璁稿氨鏄痵ocket address鐨勬剰鎬濆惂錛屽敖綆¤窡鏇村箍涔夌殑sockaddr緇撴瀯鎰忔濇湁鎵閲嶅浜嗐傚搸錛岃繖浜涢兘鏄巻鍙插師鍥狅紝涔熻鎴戞槸娌℃湁綺懼姏鍘昏冪┒浜嗐?br>
sockaddr鍜宻ockaddr_in鍦↙inux涓殑瀹炵幇

        浣犲彲鑳借繕璁板緱鎴戜箣鍓嶈榪囷紝UNIX鍜孡inux涓婄殑socket瀹炵幇閮芥槸浠嶣SD鐨剆ocket瀹炵幇婕斿彉榪囨潵鐨勩備簨瀹炰笂錛宻ocket榪欎釜璇嶆湰鏉ョ殑鎰忔濓紝灝辨槸Berkeley Socket interface鐨勭畝鍗曡娉曘侺inux涓婄殑socket涓庡師鏈殑socket鐨勫簲璇ユ槸瀹屽叏鍏煎鐨勶紝涓嶈繃鍙戝睍鍒頒粖澶╋紝鍦ㄤ唬鐮佸疄鐜頒笂鍙兘鏈変簺灝忕殑宸埆銆傛垜浠氨鍚規瘺姹傜柕鐨勬潵鐪嬬湅榪欎簺鍖哄埆鍦ㄤ粈涔堝湴鏂廣?br>
#include <bits/socket.h>

/* Structure describing a generic socket address.  */
struct sockaddr
  {
    __SOCKADDR_COMMON (sa_);    
/* Common data: address family and length.  */
    
char sa_data[14];        /* Address data.  */
  };

//==============

/* POSIX.1g specifies this type name for the `sa_family' member.  */
typedef unsigned 
short int sa_family_t;

/* This macro is used to declare the initial common members
   of the data types used for socket addresses, `struct sockaddr',
   `struct sockaddr_in', `struct sockaddr_un', etc.  
*/

#define    __SOCKADDR_COMMON(sa_prefix) \
  sa_family_t sa_prefix##family

#define __SOCKADDR_COMMON_SIZE    (sizeof (unsigned short int))
鍙互鐪嬪埌錛岃漿浜嗗嚑嬈ypedef錛屽嚑嬈″畯瀹氫箟錛屽疄闄呮晥鏋滄槸涓庢爣鍑唖ocket涓鏍風殑銆?br>
#include <netinet/in.h>

/* Internet address.  */
typedef uint32_t in_addr_t;
struct in_addr
  {
    in_addr_t s_addr;
  };

//=================

/* Structure describing an Internet socket address.  */
struct sockaddr_in
  {
    __SOCKADDR_COMMON (sin_);
    in_port_t sin_port;            
/* Port number.  */
    
struct in_addr sin_addr;        /* Internet address.  */

    
/* Pad to size of `struct sockaddr'.  */
    unsigned 
char sin_zero[sizeof (struct sockaddr) -
               __SOCKADDR_COMMON_SIZE 
-
               
sizeof (in_port_t) -
               
sizeof (struct in_addr)];
  };
鍚屾牱鐨勶紝鐪嬭搗鏉ユ尯澶嶆潅錛屽疄闄呬笂涓庢爣鍑唖ocket鐨勫畾涔夋槸涓鏍風殑銆?br>
澶存枃浠朵緷璧栧叧緋?br>        <bits/socket.h>鏄寘鍚湪<sys/socket.h>涓殑錛?lt;netinet/in.h>鏄寘鍚湪<arpa/inet.h>涓殑錛屽疄闄呬笂鎴戜滑鍦ㄧ▼搴忎腑寰寰灝辨槸錛?br>
#include <sys/socket.h>
#include 
<arpa/inet.h>
鍊煎緱鐭ラ亾鐨勬槸錛孉RPA鏄?Advanced research project agency錛堢編鍥藉浗闃查儴楂樼駭鐮旂┒璁″垝鏆戯級鐨勬墍鍐欙紝ARPANET鏄綋浠婁簰鑱旂綉鐨勫墠韜紝鎵浠ユ垜浠氨鍙互鎯寵薄錛屼負浠涔坕net.h浼氬湪arpa鐩綍涓嬩簡銆?br>

lf426 2008-07-10 15:14 鍙戣〃璇勮
]]>
socket 緙栫▼鍏ラ棬鏁欑▼錛堜竴錛塗CP server 绔細2銆乻ocket涓庢枃浠舵弿榪扮http://m.shnenglu.com/lf426/archive/2008/07/10/55771.htmllf426lf426Wed, 09 Jul 2008 18:42:00 GMThttp://m.shnenglu.com/lf426/archive/2008/07/10/55771.htmlhttp://m.shnenglu.com/lf426/comments/55771.htmlhttp://m.shnenglu.com/lf426/archive/2008/07/10/55771.html#Feedback1http://m.shnenglu.com/lf426/comments/commentRss/55771.htmlhttp://m.shnenglu.com/lf426/services/trackbacks/55771.html
UNIX涓殑涓鍒囦簨鐗╅兘鏄枃浠訛紙everything in Unix is a file!錛?br>
        褰撴垜鍦ㄨ繖綃囨暀紼嬩腑鎻愬埌UNIX鐨勬椂鍊欙紝鍏舵剰鎬濅笓鎸囩鍚圲NIX鏍囧噯鐨勬墍璋?#8220;姝g粺”UNIX鐨勮鐢熺郴緇燂紙鍏跺疄鎴戝氨鐢ㄦ潵甯︽寚閭d簺涔頒簡鏈鍒漊NIX婧愪唬鐮佺殑鍟嗕笟緋葷粺錛夋搷浣滅郴緇熷拰綾諱技Linux錛孊SD榪欎簺綾籙NIX緋葷粺銆傚鏋滄煇浜涜鐐規槸Linux鐗規湁鐨勶紝鎴栬呭洜涓烘湰浜哄闄嬪闂繪殏鏃舵悶涓嶆竻妤氭槸Linux鐗規湁鐨勮繕鏄疷NIX閫氱敤鐨勶紝鎴戝氨浼氭寚鏄庢槸Linux錛岀敋鑷沖叾鍙戣鐗堬紙鎴戞湰浜哄湪鍐欒繖綃囨暀紼嬬殑鏃跺欐槸浠ebian GNU/Linux 4.0 etch涓烘祴璇曞鉤鍙扮殑錛夈?br>        鎴戜滑瀛︿範UNIX鐨勬椂鍊欙紝鎭愭曞惉鍒扮殑絎竴鍙ヨ瘽灝辨槸榪欏彞錛歎NIX涓竴鍒囬兘鏄枃浠躲傝繖鏄疷NIX鐨勫熀鏈悊蹇典箣涓錛屼篃鏄竴鍙ュ緢濂界殑姒傛嫭銆傛瘮濡傦紝寰堝UNIX鑰侀笩浼氫婦鍑轟釜渚嬪瓙鏉ワ紝“浣犵湅錛?dev/hdc鏄釜鏂囦歡錛屽畠瀹為檯涓婁篃鏄垜鐨勫厜鐩?#8230;…”UNIX涓殑鏂囦歡鍙互鏄細緗戠粶榪炴帴錛坣etwork connection錛夛紝杈撳叆杈撳嚭錛團IFO錛夛紝綆¢亾錛坅 pipe錛夛紝緇堢錛坱erminal錛夛紝紜洏涓婄殑瀹為檯鏂囦歡錛屾垨鑰呭叾瀹冧換浣曚笢涓溿?br>
鏂囦歡涓庢枃浠舵弿榪扮錛坒ile & file descriptor錛?br>
        浣犲彲鑳藉涓婁竴绔犱腑寤烘ā綾諱腑鐨刬nt榪樿蹇嗙姽鏂般傛垜浠敤int鍦ㄦ弿榪皊ocket錛屽疄闄呬笂錛屾墍鏈夌殑鏂囦歡鎻忚堪絎﹂兘鏄痠nt錛屾病閿欙紝鐢ㄧ殑鏄竴涓暣鏁扮被鍨嬨傚鏋滀綘瑙夊緱榪欐牱璁╀綘寰堥毦鎺ュ彈錛岄偅涔堟伃鍠滀綘錛屼綘璺熸垜涓鏍鳳紝涔熻鏄繁涓瑿++闈㈠悜瀵硅薄鎬濇兂鐨勬瘨浜哵^銆傚洜涓烘槸int錛屾墍浠ユ枃浠舵弿榪扮涓嶅彲鑳芥槸C++姒傚康涓殑瀵硅薄錛屽洜涓篿nt鏃犳硶鍙戝嚭琛屼負錛屼絾鏄紝榪欏茍涓嶄唬琛ㄤ篃涓嶈兘鎺ュ彈涓涓姩浣滃搱銆?br>        PASCAL涔嬬埗鍦ㄦ壒鍒ら潰鍚戝璞℃濇兂鏁欐潯鐨勬椂鍊欙紝鏇劇粡鐢熷姩鐨勪婦浜嗕釜渚嬪瓙錛?#8220;鍦∣OP鐨勬蹇典腑錛岀粷瀵逛笉搴旇鎺ュ彈a+b榪欑琛ㄨ揪鐨勶紝 OOP瀵硅繖涓棶棰樼殑琛ㄨ揪搴旇鏄痑.add(b)”銆俧d錛坒ile descriptor錛夊彲浠ヤ綔涓烘帴鍙楀姩浣滅殑瀵硅薄錛屼絾鏄湰韜嵈鏃犳硶鍙戝嚭鍔ㄤ綔錛岃繖灝卞鍚屼竴涓彧鑳藉仛瀹捐涓嶈兘鍋氫富璇殑鍚嶈瘝錛屾槸涓笉瀹屾暣鐨勫璞°備絾鏄紝璇峰埆蹇樹簡Linux鍜宻ocket鏈韓鏄疌璇█鐨勪駭鐗╋紝鎴戜滑蹇呴』鎺ュ彈鍦ㄩ潰鍚戣繃紼嬫椂浠d笅鐨勪駭鐗╋紝姝h鍘嗗彶鈥斺斿綋鐒訛紝榪欎笌鎴戜滑鑷繁鍐嶈繘琛孫OP鐨勫皝瑁呭茍涓嶇煕鐩俱?br>        鎴戜滑搴旇璁頒綇3涓凡緇忔墦寮鐨刦d錛?錛氭爣鍑嗚緭鍏ワ紙STDIN_FILENO錛夛紱1錛氭爣鍑嗚緭鍑猴紙STDOUT_FILENO錛夛紱2錛氭爣鍑嗛敊璇紙STDERR_FILENO錛夈傦紙浠ヤ笂瀹忓畾涔夊湪<unistd.h>涓級涓涓渶綆鍗曠殑浣跨敤fd鐨勪緥瀛愶紝灝辨槸浣跨敤<unistd.h>涓殑鍑芥暟錛歸rite(1, "Hello, World!\n", 20);錛屽湪鏍囧噯杈撳嚭涓婃樉紺?#8220;Hello, World!”銆?br>        鍙﹀涓涓渶瑕佹敞鎰忕殑闂鏄紝file鍜宖d騫墮潪涓瀹氭槸涓涓瀵瑰簲鐨勩傚綋涓涓猣ile琚涓▼搴忚皟鐢ㄧ殑鏃跺欙紝浼氱敓鎴愮浉浜掔嫭绔嬬殑fd銆傝繖涓蹇靛彲浠ョ被姣斾簬C++涓殑寮曠敤錛坋g: int& rTmp = tmp;錛夈?br>
socket涓巉ile descriptor

        鏂囦歡鏄簲鐢ㄧ▼搴忎笌緋葷粺錛堝寘鎷壒瀹氱‖浠惰澶囷級涔嬮棿鐨勬ˉ姊侊紝鑰屾枃浠舵弿榪扮灝辨槸搴旂敤紼嬪簭浣跨敤榪欎釜“妗ユ”鐨勬帴鍙c傚湪闇瑕佺殑鏃跺欙紝搴旂敤紼嬪簭浼氬悜緋葷粺鐢寵涓涓枃浠訛紝鐒跺悗灝嗘枃浠剁殑鎻忚堪絎﹁繑鍥炰緵紼嬪簭浣跨敤銆傝繑鍥瀞ocket鐨勬枃浠墮氬父琚垱寤哄湪/tmp鎴栬?usr/tmp涓傛垜浠疄闄呬笂涓嶇敤鍏沖績榪欎簺鏂囦歡錛屼粎浠呰兘澶熷埄鐢ㄨ繑鍥炵殑socket鎻忚堪絎﹀氨鍙互浜嗐?br>       濂戒簡錛岃浜嗚繖涔堝錛屽疄闄呬笂灝辮В閲婁簡涓涓棶棰橈紝“涓轟粈涔坰ocket鐨勭被鍨嬫槸int錛?#8221; -_-!!!



lf426 2008-07-10 02:42 鍙戣〃璇勮
]]>
socket 緙栫▼鍏ラ棬鏁欑▼錛堜竴錛塗CP server 绔細1銆佸緩妯?/title><link>http://m.shnenglu.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://m.shnenglu.com/lf426/archive/2008/07/08/55641.html</guid><wfw:comment>http://m.shnenglu.com/lf426/comments/55641.html</wfw:comment><comments>http://m.shnenglu.com/lf426/archive/2008/07/08/55641.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://m.shnenglu.com/lf426/comments/commentRss/55641.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/lf426/services/trackbacks/55641.html</trackback:ping><description><![CDATA[浣滆咃細榫欓<br><br>        緇濆ぇ閮ㄥ垎鍏充簬socket緙栫▼鐨勬暀紼嬫繪槸浠巗ocket鐨勬蹇靛紑濮嬭璧風殑銆傝鐭ラ亾錛宻ocket鐨勫垵琛鋒槸涓簽澶х殑浣撶郴錛孴CP/IP鍙槸榪欎釜搴炲ぇ浣撶郴涓嬩竴涓緢灝忕殑瀛愰泦錛岃屾垜浠湡姝h兘鐢ㄤ笂鐨勬洿鏄繖涓瓙闆嗕腑鐨勪竴灝忛儴鍒嗭細榪愯緭灞傦紙Host-to-Host Transport Layer錛夌殑TCP鍜孶DP鍗忚錛屼互鍙婁嬌鐢ㄨ繖涓や釜鍗忚榪涜搴旂敤灞傦紙Application Layer錛夌殑寮鍙戙傚嵆浣挎槸socket鐨勬牳蹇冮儴鍒嗭紝緗戠粶灞傦紙Internet Layer錛夌殑IP鍗忚錛屽湪緙栫▼鐨勬椂鍊欐垜浠篃寰堝皯浼氭劅瑙夊埌瀹冪殑瀛樺湪鈥斺斿洜涓哄凡緇忚灝佽濂戒簡錛屾垜浠敮涓闇瑕佸仛鐨勪簨鎯呭氨鏄紶鍏ヤ竴涓畯銆傜涓鑺傛垜鎯充粙緇嶇殑姒傚康灝辮繖涔堝錛屽綋鐒訛紝鏃㈢劧鎴戜滑宸茬粡璇翠簡3涓眰浜嗭紝鎴戞兂鏈濂借繕鏄妸鏈鍚庝竴涓眰涔熻鍑烘潵錛屽嵆鎵璋撻摼璺眰錛圢etwork Access Layer錛夛紝瀹冨寘鎷簡鐗╃悊紜歡鍜岄┍鍔ㄧ▼搴忋傝繖鍥涗釜灞備粠搴曞埌楂樼殑欏哄簭鏄細閾捐礬灞傦紞錛嶇綉緇滃眰錛嶏紞榪愯緭灞傦紞錛嶅簲鐢ㄥ眰銆?br>        濂斤紝璇村疄璇濇垜浠幇鍦ㄥ茍涓嶆竻妤氭墍璋揟CP鍒板簳鏄粈涔堜笢涓滐紝涓嶈繃鎴戜滑鐭ラ亾榪欎笢涓滃悕姘斿緢澶с傛垨璁鎬綘鏃╁氨鐭ラ亾錛屽彟澶栦竴涓0鍚嶇嫾钘夊緩绔嬪湪TCP鍗忚鍩虹涓婄殑搴旂敤紼嬪簭錛屽畠鏇劇粡鍑犱箮鏄粺娌諱簡涓涓椂浠o紝鍗充嬌鏄粖澶╋紝鎴戜滑渚濈劧鏃犳硶娑堥櫎浠栫殑褰卞搷鍔涚殑鈥斺旀仼錛屾槸鐨勶紝灝辨槸telnet銆?br>        鍦ㄨ繖涓暀紼嬩腑錛屾垜浣跨敤鐨勭幆澧冩槸Debian GNU/Linux 4.0 etch銆備紶璇翠腑鐨剆table -_-!!!錛屾仼錛屾垜鏄緢淇濆畧鐨勪漢銆傚鏋滀綘涓嶆槸鑷繁DIY鍑烘潵鐨勭郴緇燂紝鐩鎬俊榛樿瀹夎閲岄潰灝卞簲璇ユ湁telnet錛?usr/bin/telnet錛岃鏄病瑁呭氨鑷繁aptitude install鍚э級銆倀elnet鍙互涓庢墍鏈夐伒寰猅CP鍗忚鐨勬湇鍔″櫒绔繘琛岄氳銆傞氬父錛宻ocket緙栫▼鎬繪槸Client/Server褰㈠紡鐨勶紝鍥犱負鏈変簡telnet錛屾垜浠彲浠ュ厛涓嶈冭檻client鐨勭▼搴忥紝鎴戜滑鍏堝啓涓涓敮鎸乀CP鍗忚鐨剆erver绔紝鐒跺悗鐢╰elnet浣滀負client楠岃瘉鎴戜滑鐨勭▼搴忓氨濂戒簡銆?br>        server绔殑鍔熻兘錛屾垜浠篃鑰冭檻涓縐嶆渶綆鍗曠殑鍙嶉褰㈠紡錛歟cho銆傚氨濡傚悓浣犲湪緇堢杈撳叆echo 'Hello World'錛屽洖杞﹀悗shell灝變細緇欎綘榪斿洖Hello World涓鏍鳳紝鎴戜滑鐨勭涓涓猅CP server灝辯敤浠ュ疄鐜拌繖涓姛鑳姐?br>        浠涔堟牱鐨勬ā鍨嬮傚悎鎻忚堪榪欐牱鐨勪竴縐峴erver鍛紵鎴戠浉淇★紝涓涓緢2鐨勪緥瀛愪細鏈夊姪浜庢垜浠蹇員CP server绔殑鍩烘湰嫻佺▼銆?br>        鎯寵薄浣犺嚜宸辨槸涓皬澶т漿錛屽潗鍔炲叕瀹わ紙浠涔堟牱鐨勯粦紺句細鍋氬姙鍏鍟婏紵鍙兘鏄鍊哄叕鍙稿惂^^錛変綘寰堝湡錛屽彧鏈変竴涓皬寮熷府浣犳帴鐢佃瘽錛堝洜涓轟綘鑷繁鐨勫彿鐮佹槸涓嶆暍瀵瑰鍏紑鐨勶級銆備竴嬈¢氳鐨勬祦紼嬪ぇ姒傚簲璇ユ槸榪欐牱鐨勶細灝忓紵閭i噷鐨勬繪満鐢佃瘽鍝嶄簡錛涘皬寮熸帴璧風數璇濓紱瀵規柟璇存槸浣犲コ鏈嬪弸A濡癸紱灝忓紵杞揪璇達紝“鑰佸ぇ錛屼綘椹瓙鐢佃瘽”錛涗綘璇達紝鎺ヨ繃鏉ワ紱灝忓紵鎶婄數璇濇帴緇欎綘錛涗綘鍜屼綘濂蟲湅鍙嬭亰澶╁崐灝忔椂錛涙寕鐢佃瘽銆?br>        鎴戜滑鏉ュ垎鏋愪竴涓嬫暣涓繃紼嬩腑鐨勫厓绱犮傚厛鍒嗘瀽鎴愬憳鏁版嵁錛堣娉ㄦ剰錛岃繖閲屽紑濮嬬敤C++鏈浜嗭級錛氫綘灝忓紵錛坙istenSock錛夛紝浣犻渶瑕佷粬鏉ョ洃鍚紙listen錛岃繖鏄痵ocket緙栫▼涓殑鏈錛夌數璇濓紱浣犺嚜宸憋紙communicationSock錛夛紝瀹為檯涓婃墦鐢佃瘽榪涜浜ゆ祦鐨勬槸浣犺嚜宸憋紱浣犵殑鐢佃瘽鍙風爜錛坰ervAddr錛夛紝鍚﹀垯浣犲コ鏈嬪弸鎬庝箞鑳芥壘鍒頒綘錛熶綘濂蟲湅鍙嬬殑鐢佃瘽鍙風爜錛坈lntAddr錛夛紝榪欎釜姣斿柣鏈夌偣鐗靛己錛屽洜涓轟簨瀹炰笂浣犳帴璧風數璇濓紝涓嶉渶瑕佺煡閬撳鏂圭殑鍙風爜涔熷彲浠ラ氳瘽錛堣櫧鐒朵簨瀹炰笂浣犲簲璇ユ槸鐭ラ亾鐨勶紝浣犱笉浼氬彇娑堜簡鏉ョ數鏄劇ず鍔熻兘鍚^錛夛紝浣嗘槸錛岄毦閬撲綘鏄彧鎺ュコ鏈嬪弸鐢佃瘽浠庢潵涓嶆墦榪囧幓鐨勭墰浜哄悧錛熻繖涓繃紼嬩腑鐨勮涓猴紙鎴愬憳鍑芥暟錛夛細浣犲皬寮熸帴鐢佃瘽騫惰漿鎺ョ粰浣狅紙isAccept()錛夛紱浣犺嚜宸辯殑閫氳瘽錛坔andleEcho()錛夛紙榪欎釜琛屼負紜疄姣旇緝鍦燂紝鍙細涔岄甫瀛﹁垖鐨別cho錛屽懙鍛碉級銆?br>        綆鍗曠殑璇達紝灝辨槸榪欎簺浜嗐傛牴鎹繖涓ā鍨嬶紝鎴戜滑鍙互寰堝鏄撳啓鍑哄疄鐜版垜浠渶瑕佺殑echo鍔熻兘鐨凾CP server鐨勭被錛?br> <div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><!--<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"> TcpServer<br>{<br></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br>    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> listenSock;<br>    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> communicationSock;<br>    sockaddr_in servAddr;<br>    sockaddr_in clntAddr;<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>    TcpServer(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> listen_port);<br>    </span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000"> isAccept();<br>    </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> handleEcho();<br>};</span></div> 榪欓噷闈㈡湁浜涚畝鍐欙紝姣斿錛宻ock瀹為檯涓婂氨鏄痵ocket錛宎ddr灝辨槸address銆俿erv鍜宑lnt鎴戞兂浣犱竴瀹氳兘鐚滃埌鏄痵erver鍜宑lient鍚с傝繕鏈変竴涓猻ocket涓殑緇撴瀯浣搒ockaddr_in錛屽疄闄呬笂灝辨槸榪欎釜鎰忔濓細socket address internet錛堢綉緇滃祵濂楀瓧鍦板潃錛夛紝鍏蜂綋瑙h錛岃鐪嬩笅鍥炲垎瑙c?br><br> <img src ="http://m.shnenglu.com/lf426/aggbug/55641.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/lf426/" target="_blank">lf426</a> 2008-07-08 15:42 <a href="http://m.shnenglu.com/lf426/archive/2008/07/08/55641.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>Code::Blocks鍦―ebian涓嬬殑緇胯壊瀹夎http://m.shnenglu.com/lf426/archive/2008/06/25/54572.htmllf426lf426Wed, 25 Jun 2008 09:46:00 GMThttp://m.shnenglu.com/lf426/archive/2008/06/25/54572.htmlhttp://m.shnenglu.com/lf426/comments/54572.htmlhttp://m.shnenglu.com/lf426/archive/2008/06/25/54572.html#Feedback0http://m.shnenglu.com/lf426/comments/commentRss/54572.htmlhttp://m.shnenglu.com/lf426/services/trackbacks/54572.html綆鐭弿榪?
濯茬編浜嶸C鐨凜++ IDE闆嗘垚寮鍙戠幆澧冿紝鍏鋒湁杈冨畬鍠勭殑鑷姩琛ュ叏鍔熻兘銆傚熀浜庡畼鏂圭殑Debian 8.02鏈鏂扮増鏈傚凡鍖呭惈libwx2.8銆傦紙Debian etch婧愪笂鐨勬槸2.6錛夈傛棤欏籸oot鏉冮檺瀹夎錛岃В鍘嬪嵆鍙嬌鐢ㄣ?br>

瀹夎姝ラ:
瑙e帇鍒拌嚜宸卞畨鎺掔殑浣嶇疆銆俢d鍒扮浉鍏崇洰褰曪紝榪愯sh鑴氭湰setup.sh灝卞彲浠ヤ簡銆傚皢鐢熸垚sh鑴氭湰codeblocks錛屽彲鐩存帴閫氳繃璇ヨ剼鏈惎鍔ㄣ傦紙瀹為檯涓婂氨鏄緗簡LD_LIBRARY_PATH鍜孋ODEBLOCKS_DATA_DIR錛?/div>
涓嬭澆鍦板潃錛?br>http://www.fs2you.com/zh-cn/files/7de0ba0c-428f-11dd-812f-00142218fc6e/

涓嬮潰浠嬬粛鑷繁榪涜緇胯壊瀹夎鐨勮繃紼嬨?br>棣栧厛鍒癈ode::Blocks鐨勯」鐩〉涓嬭澆鏈鏂扮殑鐗堟湰8.02銆?br>http://www.codeblocks.org/
褰撶劧錛屾垜鐢ㄧ殑鏄疍ebian錛屼笅杞界殑灝辨槸榪欎釜鐗堟湰錛歝odeblocks-8.02debian-i386.tar.gz銆?br>瑙e帇鍚庢槸涓鍫哾eb鍖咃紝灝忓績鐨勬妸榪欎簺鍖呰В鍘嬪埌鏌愪釜浣嶇疆涓嬬殑usr鐩綍涓嬨傦紙娉ㄦ剰錛屼笉鏄粯璁ょ殑/usr鐩綍錛夈傜劧鍚庤繖涓枃浠跺す鐨勫悕瀛椾笉閲嶈錛屾槸鍙互鏇存崲鐨勩傛瘮濡傦紝鎴戝氨鎹㈡垚浜哻odeblocks銆傝繖鏃跺欙紝榪欎釜鐩綍涓嬪簲璇ユ湁榪欎簺鏂囦歡澶癸細bin, include, lib, share銆傚叾涓紝鍙墽琛屾枃浠跺湪bin鐩綍涓嬨俢d鍒癰in鐩綍涓嬶紝媯鏌odeblocks鐨勪緷璧栧簱鍙婂叾璺緞錛?br>
ldd codeblocks
鐒跺悗鍙互鐪嬪埌涓澶у爢娌℃湁鎵懼埌鐨剆o錛?br>
        linux-gate.so.1 =>  (0xffffe000)
        libgtk
-x11-2.0.so.0 => /usr/lib/libgtk-x11-2.0.so.0 (0xb7ca1000)
        libgdk
-x11-2.0.so.0 => /usr/lib/libgdk-x11-2.0.so.0 (0xb7c20000)
        libatk
-1.0.so.0 => /usr/lib/libatk-1.0.so.0 (0xb7c06000)
        libgdk_pixbuf
-2.0.so.0 => /usr/lib/libgdk_pixbuf-2.0.so.0 (0xb7bf0000)
        libpangocairo
-1.0.so.0 => /usr/lib/libpangocairo-1.0.so.0 (0xb7be8000)
        libXext.so.
6 => /usr/lib/libXext.so.6 (0xb7bd9000)
        libXinerama.so.
1 => /usr/lib/libXinerama.so.1 (0xb7bd6000)
        libXi.so.
6 => /usr/lib/libXi.so.6 (0xb7bce000)
        libXrandr.so.
2 => /usr/lib/libXrandr.so.2 (0xb7bcb000)
        libXcursor.so.
1 => /usr/lib/libXcursor.so.1 (0xb7bc2000)
        libXfixes.so.
3 => /usr/lib/libXfixes.so.3 (0xb7bbd000)
        libpango
-1.0.so.0 => /usr/lib/libpango-1.0.so.0 (0xb7b82000)
        libcairo.so.
2 => /usr/lib/libcairo.so.2 (0xb7b20000)
        libfreetype.so.
6 => /usr/lib/libfreetype.so.6 (0xb7ab6000)
        libz.so.
1 => /usr/lib/libz.so.1 (0xb7aa2000)
        libfontconfig.so.
1 => /usr/lib/libfontconfig.so.1 (0xb7a77000)
        libpng12.so.
0 => /usr/lib/libpng12.so.0 (0xb7a54000)
        libXrender.so.
1 => /usr/lib/libXrender.so.1 (0xb7a4b000)
        libX11.so.
6 => /usr/lib/libX11.so.6 (0xb795f000)
        libgobject
-2.0.so.0 => /usr/lib/libgobject-2.0.so.0 (0xb7925000)
        libgmodule
-2.0.so.0 => /usr/lib/libgmodule-2.0.so.0 (0xb7922000)
        libglib
-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0xb7890000)
        librt.so.
1 => /lib/tls/i686/cmov/librt.so.1 (0xb7887000)
        libcodeblocks.so.
0 => not found
        libwx_gtk2u_richtext
-2.8.so.0 => not found
        libwx_gtk2u_aui
-2.8.so.0 => not found
        libwx_gtk2u_xrc
-2.8.so.0 => not found
        libwx_gtk2u_qa
-2.8.so.0 => not found
        libwx_gtk2u_html
-2.8.so.0 => not found
        libwx_gtk2u_adv
-2.8.so.0 => not found
        libwx_gtk2u_core
-2.8.so.0 => not found
        libwx_baseu_xml
-2.8.so.0 => not found
        libwx_baseu_net
-2.8.so.0 => not found
        libwx_baseu
-2.8.so.0 => not found
        libpthread.so.
0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7872000)
        libdl.so.
2 => /lib/tls/i686/cmov/libdl.so.2 (0xb786e000)
        libstdc
++.so.6 => /usr/lib/libstdc++.so.6 (0xb7789000)
        libm.so.
6 => /lib/tls/i686/cmov/libm.so.6 (0xb7764000)
        libgcc_s.so.
1 => /lib/libgcc_s.so.1 (0xb7759000)
        libc.so.
6 => /lib/tls/i686/cmov/libc.so.6 (0xb7627000)
        libpangoft2
-1.0.so.0 => /usr/lib/libpangoft2-1.0.so.0 (0xb75fc000)
        libXau.so.
6 => /usr/lib/libXau.so.6 (0xb75f9000)
        libexpat.so.
1 => /usr/lib/libexpat.so.1 (0xb75d9000)
        libXdmcp.so.
6 => /usr/lib/libXdmcp.so.6 (0xb75d3000)
        
/lib/ld-linux.so.2 (0xb7f9c000)
鍏朵腑libcodeblocks.so.0鏄疌ode::Blocks鑷甫鐨勶紝宸茬粡鍦╨ib鐩綍涓嬩簡錛屽簲涓烘垜浠病鏈夋寚瀹歀D_LABRARY_PATH璺緞鑰屾壘涓嶅埌銆?br>鍏跺畠搴撴槸灞炰簬libwx鐨勩傚湪婧愪腑鎼滅儲涓涓嬶細
aptitude search libwx
寰堜笉騫革紝婧愰噷闈㈠彧鏈?.4鍜?.6鐗堟湰鐨勩傛墍浠ワ紝鎴戜滑鍙ソ鍘粀x瀹樻柟鍘諱笅杞?.8鐨勫簱銆?br>http://www.wxwidgets.org/
鎴戜滑鍦細
http://apt.wxwidgets.org/dists/etch-wx/main/binary-i386/
涓嬫壘鍒版垜浠渶瑕佺殑鍏變韓搴撴枃浠訛細
libwxbase2.8-0_2.8.7.1-0_i386.deb 鍜?libwxgtk2.8-0_2.8.7.1-0_i386.deb 
錛堢湡蹇紝浠婂ぉ宸茬粡鏇存柊2.8.8.0浜?_-!!!搴旇涔熸病闂錛屼笉榪囨垜娌¤瘯錛?br>鎶婅В鍘嬪嚭鏉ョ殑so鍜宻-link閮芥斁鍒癱odeblocks/lib/鏂囦歡澶逛笅闈€傛渶鍚庯紝鎴戜滑璁劇疆LD_LABRARY_PATH灝卞彲浠ヤ簡銆?br>鍙互鐩存帴鐢ㄨ繖涓剼鏈緗細
#!/bin/sh

echo 
"#!/bin/sh" > codeblocks
echo 
"LD_LIBRARY_PATH=$PWD/lib CODEBLOCKS_DATA_DIR=$PWD $PWD/bin/codeblocks" >> codeblocks
chmod 
+x codeblocks
鐢熸垚鐨勫惎鍔ㄨ剼鏈簲璇ョ被浼艱繖鏍鳳細錛?PWD琛ㄧず褰撳墠鐩綍錛屼篃灝辨槸codeblocks鎵鍦ㄧ殑浣嶇疆銆傦級
#!/bin/sh
LD_LIBRARY_PATH
=/home/lf426/app/code/codeblocks/lib CODEBLOCKS_DATA_DIR=/home/lf426/app/code/codeblocks /home/lf426/app/code/codeblocks/bin/codeblocks
閫氳繃榪欎釜鑴氭湰灝卞彲浠ュ惎鍔–ode::Blocks浜嗐傛暣涓繃紼嬩笉闇瑕乺oot鏉冮檺鍝︼紙浣犱笉浼氭兂褰搑oot鏁㈡闃熷惂銆俕^錛?br>


lf426 2008-06-25 17:46 鍙戣〃璇勮
]]>Linux涓婥++ IDE鐨勯夋嫨銆?/title><link>http://m.shnenglu.com/lf426/archive/2008/06/25/54564.html</link><dc:creator>lf426</dc:creator><author>lf426</author><pubDate>Wed, 25 Jun 2008 08:45:00 GMT</pubDate><guid>http://m.shnenglu.com/lf426/archive/2008/06/25/54564.html</guid><wfw:comment>http://m.shnenglu.com/lf426/comments/54564.html</wfw:comment><comments>http://m.shnenglu.com/lf426/archive/2008/06/25/54564.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://m.shnenglu.com/lf426/comments/commentRss/54564.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/lf426/services/trackbacks/54564.html</trackback:ping><description><![CDATA[        SF琚皝浜嗭紒NND錛屾湰鏉ヨ繕璇寸敵璇蜂簡涓」鐩〉錛屽ぇ瀹跺彲浠ユ洿瀹規槗鐨勪笅杞芥簮浠g爜鐨勶紝鐜板湪鍙堟伓蹇冧簡銆傚彧鏈夌敤浠g悊浜嗐侰ode::Blocks欏圭洰涔熸槸鍦⊿F涓婄殑錛屾槰澶╂櫄涓婅繕濂藉ソ鐨勩傚ソ鍦ㄨ繖涓」鐩湪寰峰浗鏌愪釜緗戠珯榪樻湁涓暅鍍忥紝澶у搴旇鑳戒笅寰楀埌鐨勩?br>        Linux涓嬬殑C++IDE鐜涓鐩存槸涓涓紶浜虹殑闂銆傚綋鐒訛紝寰堝榛戝鍛婅瘔鎴戜滑vim瓚崇煟錛屽彲鏄垜浠瘯绔熻繕鏄緢闅句互璁頒綇閭d箞澶氬嚱鏁般傛垜鎯籌紝win32 API紜疄鏇撮毦浠ヨ蹇嗗惂錛屾墍浠$鎼炲嚭涓猇C榪欐牱鐨勫ソ涓滀笢錛汱inux涓嬬殑鐗涗漢浠兘鏄粠70騫翠唬寮濮嬬帺C鐨勪漢錛屼粬浠澶氬皯灝戞洿涔犳儻C鑰屼笉鏄疌++錛屽寘鎷琇inus鏈漢榪樿窡BS鑰佸ぇ鎵撹繃鍙f按鎴樸傛墍浠ワ紝vim瀵逛簬浠栦滑錛屽浜嶤錛屽彲鑳藉凡緇忕浉褰撳鐢ㄤ簡鈥斺斾絾鏄紝鎴戜滑鏄嚒浜猴紝鎴戜滑榪樻槸甯屾湜鏈変釜鑷姩琛ュ叏鍔熻兘姣旇緝寮猴紝涔熶笉鐢ㄦ瘡嬈¢兘鑷繁鍐橫akefile鐨処DE銆?br>        鍏跺疄涓寮濮嬪叧娉ㄧ殑鏄疉njuta錛屽洜涓鴻繖鏄彿縐癎nome涓嬬殑鍘熺敓鍝侊紝鍙儨鍟婏紝鍔熻兘瀹炲湪鏄お涓鑸埇浜嗭紝閮借繕涓嶅鐢╲im鍔犲悇縐嶆彃浠跺憿銆傚悗鏉ュ張璇曚簡<a title="eclipse" >eclipse</a> 姣擜njuta寮轟簡涓嶅皯錛岃繖涓」鐩ソ鍍忔槸寰楀埌鍝釜澶у叕鍙歌祫鍔╀簡錛屾悶寰楀緢鍗庝附鐨勬牱瀛愩傚彲鏄紝鍩轟簬Java錛岄熷害榪樻槸鎱㈠晩銆傚彟澶栵紝閫肩潃鎴戣JVM涔熻鎴戞瘮杈冧笉鐖姐傚綋鍓峀inux涓嬪ぇ鏈塒ython娣樻卑Java鐨勮秼鍔褲侹Develop鍚鏄笉閿欙紝鍙槸鎴戣繕娌″紑濮嬬敤KDE錛岃矊浼奸潪鍘熺敓鍝侊紝鎬曢夯鐑︼紝蹇嶄簡銆?br>        鏄ㄥぉ鍦ㄨ鍧涗笂鐪嬪埌澶у璁ㄨcodeblocks錛屼箣鍓嶅湪Windows涓嬪叧娉ㄨ繃錛屽悗鏉ヤ紶闂昏涓嶅啀緇存姢浜嗭紝灝辨病鏀懼湪蹇冧笂銆備紶闂繪瘯绔熸槸浼犻椈錛屾槰澶╁埌codeblocks欏圭洰欏典笂鐪嬩簡涓嬶紝鏈鏂扮殑鏇存柊鏄湪浠婂勾2鏈堝簳鍛碉紝鏈夊鏂扮殑銆備及璁℃槸涔嬪墠鍛ㄦ湡澶暱浜嗗惂銆傛參鍔熷嚭緇嗘椿錛屾湰鐫瀵瑰痙鍥戒漢璁ょ湡鎬佸害鐨勬暚浣╋紝涓嬭澆涓嬫潵璇曚簡涓涓嬧斺旀灉鐒訛紝姣攅clipse瑕佸揩寰堝鍟娿傚搱鍝堬紝铏界劧璺烿C榪樻槸鏈夊樊璺濓紝涓嶈繃涔熺畻鏄敤璧鋒潵姣旇緝鑸掑績鐨処DE浜嗐傛墍浠ユ帹鑽愮粰澶у銆備笅綃囨枃绔狅紝鎴戞潵璁茶鍦―ebian 4.0 ecth涓嬬殑緇胯壊瀹夎鏂規硶銆?br><img src ="http://m.shnenglu.com/lf426/aggbug/54564.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/lf426/" target="_blank">lf426</a> 2008-06-25 16:45 <a href="http://m.shnenglu.com/lf426/archive/2008/06/25/54564.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>鏋勫緩vim鐨勫彲瑙嗗寲C++緙栬緫騫沖彴http://m.shnenglu.com/lf426/archive/2008/05/27/51300.htmllf426lf426Tue, 27 May 2008 09:29:00 GMThttp://m.shnenglu.com/lf426/archive/2008/05/27/51300.htmlhttp://m.shnenglu.com/lf426/comments/51300.htmlhttp://m.shnenglu.com/lf426/archive/2008/05/27/51300.html#Feedback0http://m.shnenglu.com/lf426/comments/commentRss/51300.htmlhttp://m.shnenglu.com/lf426/services/trackbacks/51300.html        Vim鐨勯厤緗枃浠墮氬父鍦▇/.vimrc涓傛垜浠鍏堝彲浠ュ姞鍏ヨ繖鏍蜂袱鍙ワ細
syntax on            //璇硶楂樹寒鎵撳紑錛岃繖鏍鋒垜浠氨鍙互鐪嬪扖/C++鐨勫叧閿瓧鎴愪負浜嗗僵鑹詫紱
:set cin!               //C緙╄繘鎵撳紑錛岃繖鏍穠im浼氳嚜鍔ㄥ垽鏂緝榪涚殑璁劇疆錛?br>        瀹屾垚榪欐牱鐨勮緗悗錛屽綋鎴戜滑鍒涘緩鎴栬呮墦寮vim鎵鑳借瘑鍒殑C/C++婧愭枃浠剁殑鏃跺欙紝鎴戜滑灝卞彲浠ョ湅鍒板叧閿瓧鐨勯鑹蹭互鍙婅嚜鍔ㄧ殑緙╄繘浜嗐?br>        闇瑕佹寚鍑虹殑涓鐐規槸錛屾寜鐓nix婧愮▼搴忕殑涔犳儻錛屾垜浠渶濂戒互ASCII緙栫爜鏉ュ啓紼嬪簭錛岃孌ebian鐨勫唴閮ㄧ紪鐮侀粯璁ゆ槸UTF-8銆傚綋鐒訛紝濡傛灉鎴戜滑vim鍒涘緩鐨勬枃浠舵病鏈夋眽瀛楃瓑鍏朵粬瀛楃鐨勬椂鍊欙紝浜х敓鐨勬枃浠惰嚜鍔ㄦ槸ASCII緙栫爜鐨勶紝浣嗘槸錛屾煇浜涙彃浠訛紝姣斿vim鐨刢-support鎻掍歡浼氳嚜鍔ㄦ坊鍔犳枃浠剁殑鍒涘緩鏃ユ湡錛岃繖鏍鳳紝鍥犱負鎴戜滑緋葷粺榛樿璇█涓鑸槸zh_CN錛屾墍浠ュ氨浼氫駭鐢熶腑鏂囩殑鏃ユ湡鏄劇ず銆傛墍浠ワ紝涓涓В鍐蟲柟娉曟槸鍦ㄨ繍琛屽垱寤篶pp鏂囦歡鐨剉im鐨勬椂鍊欙紝鎸囧畾浣跨敤鐨勮璦錛屾垨鑰咃紝騫茶剢鍋氫竴涓猘lias鏉ョ畝鍗曚嬌鐢細
alias cvim='LC_ALL=C vim'
榪欐牱錛屽氨鍙互紜繚鍒涘緩鐨刢pp鏂囦歡涓嶅甫闈濧SCII瀛楃銆?br>
        鎺ヤ笅鏉ワ紝鎴戜滑綆鍗曚簡瑙d竴涓媍tags銆傜畝鍗曡錛宑tags鏄負璁稿璁$畻鏈鴻璦鐨勬簮浠g爜鏂囦歡鍋氱儲寮曪紝浠ユ彁渚涚粰緙栬緫鍣紙姣斿鎴戜滑鐨剉im錛変嬌鐢ㄧ殑銆傛垜浠厛鐪嬬湅ctags鐨勫府鍔╋細
ctags --help
浠ヤ笅淇℃伅鏄垜浠皢鐢ㄥ埌鐨勶細
-R   Equivalent to --recurse.
--recurse=[yes|no]    Recurse into directories supplied on command line [no].
--languages=[+|-]list
       Restrict files scanned for tags to those mapped to langauges
       specified in the comma-separated 'list'. The list can contain any
       built-in or user-defined language [all].
--fields=[+|-]flags
      Include selected extension fields (flags: "afmikKlnsStz") [fks].
--extra=[+|-]flags
      Include extra tag entries for selected information (flags: "fq").
鎴戜滑鐢ㄨ繖鏍風殑鍛戒護鍦ㄦ簮鏂囦歡鎵鍦ㄧ殑鐩綍榪愯錛氾紙鐢ㄦ牱錛屾垜浠彲浠ュ仛涓涓猘lias錛屾垜浠渶鍚庢潵璁ㄨ榪欎釜闂錛?br>ctags -R --c++-kinds=+p --fields=+iaS --extra=+q
鍏朵腑鍙傛暟鐨勫惈涔夋槸錛?a title="鍘熸枃鍑哄" >鍘熸枃鍑哄
--c++-kinds=+p  : 涓篊++鏂囦歡澧炲姞鍑芥暟鍘熷瀷鐨勬爣絳?br>--fields=+iaS   : 鍦ㄦ爣絳炬枃浠朵腑鍔犲叆緇ф壙淇℃伅(i)銆佺被鎴愬憳鐨勮闂帶鍒朵俊鎭?a)銆佷互鍙婂嚱鏁扮殑鎸囩汗(S)
--extra=+q      : 涓烘爣絳懼鍔犵被淇グ絎︺傛敞鎰忥紝濡傛灉娌℃湁姝ら夐」錛屽皢涓嶈兘瀵圭被鎴愬憳琛ュ叏

        濂戒簡錛岀幇鍦ㄥ噯澶囩煡璇嗚瀹屼簡銆傛垜浠厛瀹炵幇C++瀵硅薄鐢?鎴栬?>璋冪敤鏂規硶鐨勬椂鍊欒嚜鍔ㄤ駭鐢熼夋嫨鐨勪笅鎷夎彍鍗曘傛垜浠渶瑕佺殑鎻掍歡鏄疧mniCppComplete錛屽湪vim瀹樻柟榪欓噷涓嬭澆錛?br>http://www.vim.org/scripts/script.php?script_id=1520
涓嬭澆鍒扮殑鏄竴涓帇緙╁寘錛岃В鍘嬪埌~/.vim/涓嬬浉搴旂殑鐩綍灝卞彲浠ヤ簡銆傚彟澶栵紝鎴戜滑闇瑕佸湪~/.vimrc涓墦寮瑁呰澆鎻掍歡錛?br>:filetype plugin on
錛堟垨璁歌繕闇瑕佹墦寮vim瀵規簮浠g爜鐨勮瘑鍒紝涓嶈繃鎴戞槸娌℃湁鐢ㄥ埌錛孌ebian 4.0錛屽鏋滈渶瑕佺殑璇濓紝鍐嶅姞涓?filetype indent on錛?br>鍙﹀錛屾垜浠叧闂璿im榛樿鐨勯瑙堢獥鍙o細
:set completeopt=longest,menu
        榪欐牱錛屽綋鎴戜滑鍒涘緩浜嗗璞★紝鐢?鎴栬?>鐨勬椂鍊欙紝灝變細鑷姩璋冨嚭綾繪柟娉曠殑閫夋嫨紿楀彛浜嗐?br>
        鍙﹀涓涓父瑙佺殑琛ュ叏鏄鍑芥暟鐨勮ˉ鍏紝涔熸湁鐜版垚鐨勬彃浠跺彲浠ョ敤code_complete錛?br>http://www.vim.org/scripts/script.php?script_id=1764
榪欎釜瀹夎灝辨洿綆鍗曚簡錛岀洿鎺ユ妸code_complete.vim鎷瘋礉鍒皛/.vim/plugin/涓嬮潰灝卞彲浠ヤ簡銆?br>鎻掍歡鐨勪嬌鐢ㄦ柟娉曟槸錛屽綋鍐欏畬涓涓嚱鏁幫紝騫舵墦涓婂乏鎷彿(涔嬪悗錛屾寜tab閿氨鍙互鐪嬪掑嚱鏁板弬鏁板垪琛ㄤ簡錛屽寘鎷噸杞界殑鍑芥暟銆?br>
        鏈鍚庯紝鎴戜滑涓嶅笇鏈涜閭d箞澶氬弬鏁幫紝甯屾湜浣跨敤璧鋒潵綆鍗曚竴浜涳紝鎴戜滑鍙渶瑕佸湪bash榪愯鐨勬椂鍊欑敵鏄庢垜浠殑涓や釜alias灝卞彲浠ヤ簡銆傚湪~/.bashrc涓坊鍔狅細
alias vctags='ctags -R --c++-kinds=+p --fields=+iaS --extra=+q'
alias cvim='LC_ALL=C vim'
鍏抽棴緇堢鍚庨噸鍚姩錛屽彲浠ョ敤type鏌ョ湅鎴戜滑鐨勬柊鍛戒護宸茬粡鐢熸晥浜嗭細
lf426@fleet:~$ type vctags
vctags is aliased to `ctags -R --c++-kinds=+p --fields=+iaS --extra=+q'





lf426 2008-05-27 17:29 鍙戣〃璇勮
]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              亚洲欧美中文另类| 亚洲一卡二卡三卡四卡五卡| 欧美成人性网| 欧美国产视频日韩| 欧美日韩精品一区二区天天拍小说 | 久久精品一区| 免费短视频成人日韩| 欧美激情精品久久久久久蜜臀| 美女在线一区二区| 亚洲精品久久嫩草网站秘色 | 国产精品福利av| 国产精品综合视频| 亚洲国产精品一区二区尤物区| 日韩视频免费| 久久国产精品99国产| 亚洲丶国产丶欧美一区二区三区 | 亚洲免费观看高清完整版在线观看| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 亚洲欧美视频| 欧美成人一区二区三区| 久久超碰97中文字幕| aa亚洲婷婷| 亚洲视频精选| 欧美一区午夜精品| 久久久99爱| 欧美日韩成人在线视频| 国内精品久久久久久久97牛牛| 亚洲国产精品va在线看黑人 | 亚洲毛片av在线| 亚洲男女自偷自拍| 欧美激情一区二区三区| 国产日韩欧美亚洲一区| 亚洲每日更新| 另类亚洲自拍| 亚洲男人av电影| 欧美日韩免费观看中文| 在线成人h网| 欧美在线观看视频在线 | 农村妇女精品| 黄网站免费久久| 亚洲欧美一区二区原创| 亚洲精品日韩在线| 牛牛精品成人免费视频| 精品69视频一区二区三区| 亚洲女人av| 日韩亚洲视频在线| 欧美高清成人| 亚洲精选在线观看| 欧美黄色免费| 免费日韩av| 亚洲国产精品一区在线观看不卡| 欧美一区二区三区日韩视频| 亚洲视频axxx| 国产精品久久久久天堂| 在线视频精品| 一本久道久久综合中文字幕| 欧美日韩八区| 一级日韩一区在线观看| 亚洲免费观看在线视频| 欧美人与禽猛交乱配| 亚洲精品欧美专区| 亚洲国产三级在线| 欧美激情一区| 亚洲一区二区三区成人在线视频精品| 亚洲国产精品va在线看黑人| 欧美jizz19性欧美| 日韩一级视频免费观看在线| 亚洲精品国产精品久久清纯直播 | 欧美日精品一区视频| 中国av一区| 亚洲视频一二区| 欧美一区二区在线免费观看| 9l国产精品久久久久麻豆| 欧美激情一区在线| 欧美—级在线免费片| 99在线|亚洲一区二区| 亚洲美女在线视频| 国产精品婷婷午夜在线观看| 久久亚洲风情| 欧美二区不卡| 亚洲资源av| 欧美在线视频一区| 最近看过的日韩成人| 日韩一级在线观看| 国产亚洲一级高清| 亚洲国产一区二区三区高清| 国产精品v亚洲精品v日韩精品| 性欧美大战久久久久久久免费观看| 午夜在线成人av| 91久久精品视频| 亚洲尤物在线视频观看| 亚洲福利视频三区| 亚洲天天影视| 亚洲精品乱码久久久久久蜜桃91| 亚洲网站在线看| 亚洲大胆女人| 亚洲综合国产| 亚洲免费高清| 久久精品人人做人人爽| 一本色道久久综合狠狠躁篇怎么玩 | 激情五月综合色婷婷一区二区| 亚洲高清视频一区二区| 国产精品日韩专区| 亚洲精品美女久久7777777| 国产日韩欧美制服另类| 亚洲精品你懂的| 一色屋精品视频在线观看网站| 一本色道精品久久一区二区三区| 在线观看日韩精品| 亚洲视频图片小说| 99精品国产热久久91蜜凸| 久久精品国产一区二区三区免费看| 一区二区精品| 欧美经典一区二区| 欧美福利电影网| 黄色成人在线观看| 午夜精品久久久久久久男人的天堂 | 国产免费一区二区三区香蕉精| 亚洲欧洲另类| 亚洲大胆女人| 久久久久欧美精品| 久久久精品国产一区二区三区| 欧美涩涩视频| 日韩视频免费| 一本大道久久a久久精品综合| 美国三级日本三级久久99| 久久人人爽爽爽人久久久| 国产精品五月天| 亚洲欧美日韩在线播放| 欧美视频日韩视频在线观看| 日韩午夜免费视频| 欧美一区二区在线免费播放| 亚洲嫩草精品久久| 欧美视频在线免费| 99精品国产高清一区二区| 亚洲精品激情| 欧美人与性动交α欧美精品济南到| 亚洲第一黄网| 亚洲美女av电影| 欧美日韩黄视频| 日韩视频在线观看免费| 中文久久精品| 国产精品久久久久国产a级| 亚洲天堂av在线免费观看| 欧美伊人精品成人久久综合97 | 欧美在线免费看| 久久综合999| 亚洲国产精品成人| 欧美国产极速在线| 日韩天天综合| 亚洲嫩草精品久久| 国产一区二区三区在线免费观看 | 亚洲欧美视频在线观看| 国产裸体写真av一区二区| 欧美一区二区播放| 欧美成人午夜77777| 99精品热视频| 国产欧美综合一区二区三区| 久久精品夜夜夜夜久久| 亚洲激情图片小说视频| 亚洲宅男天堂在线观看无病毒| 国产欧美三级| 女同性一区二区三区人了人一| 亚洲精品免费在线播放| 欧美在线视频不卡| 91久久精品国产91久久性色| 国产精品地址| 久久天堂av综合合色| 日韩亚洲欧美一区| 免费一级欧美片在线观看| 中文日韩欧美| 亚洲电影免费观看高清完整版| 欧美午夜激情小视频| 久久久久国产成人精品亚洲午夜| 亚洲黑丝在线| 久久九九久久九九| 一级成人国产| 亚洲国产成人精品久久| 国产精品久久久久久久久久尿| 美女被久久久| 欧美影院精品一区| 亚洲深夜激情| 亚洲精品免费在线| 欧美成人免费一级人片100| 午夜精品在线观看| 日韩午夜电影| 1000部精品久久久久久久久| 国产精品视频久久一区| 欧美二区在线播放| 久久久精品日韩| 亚洲欧美网站| 亚洲一区二区免费看| 亚洲人成亚洲人成在线观看| 久久综合伊人77777蜜臀| 欧美一级在线视频| 亚洲一区欧美| 亚洲少妇在线| 欧美激情网站在线观看| 亚洲另类自拍| 海角社区69精品视频|