﻿<?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++博客-天下-随笔分类-Socket</title><link>http://www.cppblog.com/aaxron/category/16222.html</link><description>记录修行的印记
</description><language>zh-cn</language><lastBuildDate>Fri, 14 Jun 2013 13:20:45 GMT</lastBuildDate><pubDate>Fri, 14 Jun 2013 13:20:45 GMT</pubDate><ttl>60</ttl><item><title>udp发送广播</title><link>http://www.cppblog.com/aaxron/archive/2013/06/13/200986.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Thu, 13 Jun 2013 08:29:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2013/06/13/200986.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/200986.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2013/06/13/200986.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/200986.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/200986.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; word-break: break-all; 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&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">stdafx.h</span><span style="color: #000000">"</span><span style="color: #000000"><br /><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_tmain(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;argc,&nbsp;_TCHAR</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;argv[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;wVersionRequested;<br />&nbsp;&nbsp;&nbsp;&nbsp;WSADATA&nbsp;wsaData;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;err;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;so_broadcast</span><span style="color: #000000">=</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;ret;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;wVersionRequested&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;MAKEWORD(&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;err&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;WSAStartup(&nbsp;wVersionRequested,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">wsaData&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(&nbsp;err&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;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;SOCKET&nbsp;fd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;socket(AF_INET,&nbsp;SOCK_DGRAM,&nbsp;IPPROTO_UDP);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(fd&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;INVALID_SOCKET)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">Error&nbsp;at&nbsp;socket():&nbsp;%ld\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;WSAGetLastError()&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WSACleanup();<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: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;err&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;setsockopt(fd,SOL_SOCKET,SO_BROADCAST,(</span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">)</span><span style="color: #000000">&amp;</span><span style="color: #000000">so_broadcast,</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(so_broadcast));<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(&nbsp;err&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;printf(</span><span style="color: #000000">"</span><span style="color: #000000">Error&nbsp;at&nbsp;setsockopt():&nbsp;%ld\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;WSAGetLastError()&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WSACleanup();<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: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;buf[</span><span style="color: #000000">256</span><span style="color: #000000">];<br />&nbsp;&nbsp;&nbsp;&nbsp;sprintf(buf,</span><span style="color: #000000">"</span><span style="color: #000000">%d</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">12345678</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;sockaddr_in&nbsp;addr;<br />&nbsp;&nbsp;&nbsp;&nbsp;addr.sin_family&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;AF_INET;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">受限广播地址,需要设置调用setsockopt(),用SO_BROADCAST选项!<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">addr.sin_addr.s_addr&nbsp;=&nbsp;inet_addr(&nbsp;"255.255.255.255");<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">直接广播地址</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;addr.sin_addr.s_addr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;inet_addr(&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">192.168.1.255</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;addr.sin_port&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;htons(&nbsp;</span><span style="color: #000000">5005</span><span style="color: #000000">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sendto(fd,buf,strlen(buf)</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000">0</span><span style="color: #000000">,(sockaddr</span><span style="color: #000000">*</span><span style="color: #000000">)</span><span style="color: #000000">&amp;</span><span style="color: #000000">addr,</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(addr));<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">sended&nbsp;len=%d&nbsp;\n</span><span style="color: #000000">"</span><span style="color: #000000">,ret);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(ret</span><span style="color: #000000">==-</span><span style="color: #000000">1</span><span style="color: #000000">){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;WSAGetLastError();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">err=%d&nbsp;\n</span><span style="color: #000000">"</span><span style="color: #000000">,err);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;WSACleanup();<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 />}<br /><br /></span></div><img src ="http://www.cppblog.com/aaxron/aggbug/200986.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2013-06-13 16:29 <a href="http://www.cppblog.com/aaxron/archive/2013/06/13/200986.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>猪八戒夜战子网</title><link>http://www.cppblog.com/aaxron/archive/2012/10/09/193070.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Tue, 09 Oct 2012 09:22:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2012/10/09/193070.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/193070.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2012/10/09/193070.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/193070.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/193070.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->//获取广播地址//在udp接收广播时,如果有多块网卡,会重复收包,//所以udp发送广播时,最好指定直接的广播地址,不要用受限的广播地址255.255.255.255unsigned&nbsp;int&...&nbsp;&nbsp;<a href='http://www.cppblog.com/aaxron/archive/2012/10/09/193070.html'>阅读全文</a><img src ="http://www.cppblog.com/aaxron/aggbug/193070.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2012-10-09 17:22 <a href="http://www.cppblog.com/aaxron/archive/2012/10/09/193070.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>getaddrinfo函数</title><link>http://www.cppblog.com/aaxron/archive/2012/05/15/174986.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Tue, 15 May 2012 08:57:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2012/05/15/174986.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/174986.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2012/05/15/174986.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/174986.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/174986.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; 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; ">stdio.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; ">stdlib.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: #0000FF; ">string</span><span style="color: #000000; ">.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; ">vector</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />
<br />
#ifdef&nbsp;WIN32<br />
&nbsp;&nbsp;&nbsp;&nbsp;#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">WinSock2.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">ws2tcpip.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;#pragma&nbsp;comment(lib,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Ws2_32.lib</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">end&nbsp;WIN32</span><span style="color: #008000; "><br />
</span><span style="color: #0000FF; ">#else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">Linux</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;#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 />
&nbsp;&nbsp;&nbsp;&nbsp;#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 />
&nbsp;&nbsp;&nbsp;&nbsp;#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 />
&nbsp;&nbsp;&nbsp;&nbsp;#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 />
&nbsp;&nbsp;&nbsp;&nbsp;#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">netdb.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />
</span><span style="color: #0000FF; ">#endif</span><span style="color: #000000; ">&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">end&nbsp;Linux</span><span style="color: #000000; "><br />
<br />
typedef&nbsp;std::vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;in_addr</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;array_in_addr;<br />
</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;GetHostsByName(&nbsp;</span><span style="color: #0000FF; ">const</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; ">host_name,array_in_addr</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;pArrayaddr)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;n</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;addrinfo&nbsp;hints,</span><span style="color: #000000; ">*</span><span style="color: #000000; ">res;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;addrinfo</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;p_addrinfo&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;NULL;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;memset(&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">hints,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;addrinfo)&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;hints.ai_flags&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;AI_CANONNAME;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">客户端一般就用这个&nbsp;AI_CANONNAME,服务端建议用:AI_PASSIVE&nbsp;</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;hints.ai_family&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;AF_INET;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">AF_INET:IPv4&nbsp;,AF_INET6:IPv6</span><span style="color: #008000; "><br />
</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;hints.ai_socktype&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;SOCK_STREAM;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">IPPROTO_IP&nbsp;可能会产生多个重复IP</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;sockaddr_in</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;p_sockaddr_in;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(&nbsp;(n&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;getaddrinfo(&nbsp;host_name,NULL,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">hints,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">res)&nbsp;)&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;&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 />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">domain:%s&nbsp;\r\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,host_name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;p_addrinfo&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;res;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(p_addrinfo</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">NULL)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pArrayaddr</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">push_back(&nbsp;((sockaddr_in</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)p_addrinfo</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">ai_addr)</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">sin_addr);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">ip%d:&nbsp;%s&nbsp;\r\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,pArrayaddr</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">size(),inet_ntoa(((sockaddr_in</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)p_addrinfo</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">ai_addr)</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">sin_addr));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_addrinfo&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;p_addrinfo</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">ai_next;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;freeaddrinfo(res);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;pArrayaddr</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">size();&nbsp;&nbsp;&nbsp;&nbsp;<br />
}<br />
<br />
<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; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">argv[])<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;nRet;<br />
&nbsp;&nbsp;&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;pszHost&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;NULL;<br />
&nbsp;&nbsp;&nbsp;&nbsp;array_in_addr&nbsp;inaddrs;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&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;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Usage:%s&nbsp;&lt;hostname&gt;&nbsp;\r\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,argv[</span><span style="color: #000000; ">0</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: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;pszHost&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;argv[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">];<br />
<br />
#ifdef&nbsp;WIN32<br />
&nbsp;&nbsp;&nbsp;&nbsp;WSADATA&nbsp;wsaData;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;err&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;WSAStartup(&nbsp;</span><span style="color: #000000; ">0x0202</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">wsaData&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(&nbsp;err&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;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">socket&nbsp;init(WSAStartup)&nbsp;failure&nbsp;\r\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: #000000; ">1</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #0000FF; ">#endif</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;GetHostsByName(pszHost,</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">inaddrs);<br />
<br />
#ifdef&nbsp;WIN32<br />
&nbsp;&nbsp;&nbsp;&nbsp;WSACleanup();<br />
</span><span style="color: #0000FF; ">#endif</span><span style="color: #000000; "><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 />
}<br />
<br />
</span></div>
<p>参见网址:</p><p>http://baike.baidu.com/view/6757218.htm
</p><img src ="http://www.cppblog.com/aaxron/aggbug/174986.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2012-05-15 16:57 <a href="http://www.cppblog.com/aaxron/archive/2012/05/15/174986.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>socket函数send和recv函数</title><link>http://www.cppblog.com/aaxron/archive/2012/04/27/172891.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Fri, 27 Apr 2012 01:14:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2012/04/27/172891.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/172891.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2012/04/27/172891.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/172891.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/172891.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->在发送端，一次发送4092个字节，在接收端，一次接收4092个字节，但是在接收端，偶尔会出现&nbsp;socket.receive&nbsp;接收不全的情况&nbsp;，ret&nbsp;=&nbsp;...&nbsp;&nbsp;<a href='http://www.cppblog.com/aaxron/archive/2012/04/27/172891.html'>阅读全文</a><img src ="http://www.cppblog.com/aaxron/aggbug/172891.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2012-04-27 09:14 <a href="http://www.cppblog.com/aaxron/archive/2012/04/27/172891.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TCP与UDP的不同接包处理方式</title><link>http://www.cppblog.com/aaxron/archive/2012/01/06/163734.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Fri, 06 Jan 2012 09:03:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2012/01/06/163734.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/163734.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2012/01/06/163734.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/163734.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/163734.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">TCP与UDP的不同接包处理方式<br /><br /><br /></span><span style="color: #000000; ">1</span><span style="color: #000000; ">.UDP发包的问题<br />问：udp&nbsp;发送两次数据，第一次&nbsp;100字节&nbsp;，第二次200字节，&nbsp;接包方一次recvfrom(&nbsp;</span><span style="color: #000000; ">1000</span><span style="color: #000000; ">&nbsp;),&nbsp;收到是&nbsp;</span><span style="color: #000000; ">100</span><span style="color: #000000; ">，还是200，还是300？<br />答：UDP是数据报文协议，是以数据包方式，所以每次可以接收100，</span><span style="color: #000000; ">200</span><span style="color: #000000; ">，在理想情况下，第一次是无论recvfrom多少都是接收到100。当然，可能由于网络原因，第二个包先到的话，有可能是200了。对可能会由于网络原因乱序，所以可能先收到200，所以自定义的udp协议包头里都要加上一个序列号，标识发送与收包对应<br /><br /></span><span style="color: #000000; ">2</span><span style="color: #000000; ">.TCP的发包问题<br />问：同样如果换成tcp,&nbsp;第一次发送&nbsp;100字节&nbsp;，第二次发送200字节，recv(&nbsp;</span><span style="color: #000000; ">1000</span><span style="color: #000000; ">&nbsp;)会接收到多少？<br />答：tcp是流协议，所以recv(&nbsp;</span><span style="color: #000000; ">1000</span><span style="color: #000000; ">&nbsp;)，会收到300&nbsp;tcp自己处理好了重传，保证数据包的完整性<br /><br /></span><span style="color: #000000; ">3</span><span style="color: #000000; ">.有分片的情况下如下处理<br />问：如果MTU是1500，使用UDP发送&nbsp;</span><span style="color: #000000; ">2000</span><span style="color: #000000; ">，那么recvfrom(</span><span style="color: #000000; ">2000</span><span style="color: #000000; ">)是收到1500，还是2000</span><span style="color: #000000; ">?</span><span style="color: #000000; "><br />答：&nbsp;还是接收2000，数据分片由ip层处理了，放到udp还是一个完整的包。接收到的包是由路由路径上最少的MTU来分片，注意转到UDP已经在是组装好的(组装出错的包会经crc校验出错而丢弃)，是一个完整的数据包<br /><br /></span><span style="color: #000000; ">4</span><span style="color: #000000; ">.分片后的处理<br />问：如果500那个片丢了怎么办？udp又没有重传<br />答：udp里有个crc检验，如果包不完整就会丢弃，也不会通知是否接收成功，所以UDP是不可靠的传输协议，而且TCP不存在这个问题，有自己的重传机制。在内网来说，UDP基本不会有丢包，可靠性还是有保障。当然如果是要求有时序性和高可靠性，还是走TCP，不然就要自己提供重传和乱序处理(&nbsp;UDP内网发包处理量可以达&nbsp;7w</span><span style="color: #000000; ">~</span><span style="color: #000000; ">10w</span><span style="color: #000000; ">/</span><span style="color: #000000; ">s&nbsp;)<br /><br /></span><span style="color: #000000; ">5</span><span style="color: #000000; ">.不同连接到同一个端口的包处理<br />问：TCP<br />A&nbsp;</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">&nbsp;C&nbsp;发100<br />B&nbsp;</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">&nbsp;C&nbsp;发200<br />AB同时同一端口<br />C&nbsp;recv(</span><span style="color: #000000; ">1000</span><span style="color: #000000; ">)&nbsp;,会收到多少？<br />答：A与C是一个tcp连接，B与C又是另一个tcp连接，&nbsp;所以不同socket，所以分开处理。每个socket有自己的接收缓冲和发送缓冲<br /><br /></span><span style="color: #000000; ">6</span><span style="color: #000000; ">.什么是TCP粘包<br /><br />由于TCP是流协议，对于一个socket的包，如发送&nbsp;10AAAAABBBBB两次，由于网络原因第一次又分成两次发送，&nbsp;10AAAAAB和BBBB，如果接包的时候先读取10(包长度)再读入后续数据，当接收得快，发送的慢时，就会出现先接收了&nbsp;10AAAAAB,会解释错误&nbsp;,再接到到BBBB10AAAAABBBBB，也解释错误的情况。这就是TCP的粘包。<br />&nbsp;&nbsp;&nbsp;解决的办法TLV方式，先接收包头，在包头里指定包体长度来接收。设置包头包尾的检查位（如群空间0x2开头，0x3结束来检查一个包是否完整）。对于TCP来说：</span><span style="color: #000000; ">1</span><span style="color: #000000; ">）不存在丢包，错包，所以不会出现数据出错&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">）如果包头检测错误，即为非法或者请求，直接重置即可<br />7.<br /><div><p>For message-oriented sockets, data is extracted from the first enqueued  message, up to the size of the buffer specified. If the datagram or message is  larger than the buffer specified, the buffer is filled with the first part of  the datagram, and <strong>recvfrom</strong> generates the error <a href="">WSAEMSGSIZE</a>.  For unreliable protocols (for example, UDP) the excess data is lost.<br /><br /></p></div></span></div><img src ="http://www.cppblog.com/aaxron/aggbug/163734.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2012-01-06 17:03 <a href="http://www.cppblog.com/aaxron/archive/2012/01/06/163734.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简单协议设计</title><link>http://www.cppblog.com/aaxron/archive/2011/10/12/158137.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Wed, 12 Oct 2011 08:01:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2011/10/12/158137.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/158137.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2011/10/12/158137.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/158137.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/158137.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">#pragma&nbsp;pack(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)<br />typedef&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;_tag_COMM_PACK_REQUEST<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;BYTE&nbsp;&nbsp;&nbsp;&nbsp;header[</span><span style="color: #000000; ">2</span><span style="color: #000000; ">];&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">2字节,协议头</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;UINT64&nbsp;&nbsp;&nbsp;&nbsp;requestID;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">8字节,流水号</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;BYTE&nbsp;&nbsp;&nbsp;&nbsp;entryType;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">1字节,加密类型</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;&nbsp;&nbsp;&nbsp;cmd;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">4字节,命令</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;&nbsp;&nbsp;&nbsp;dataLen;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">4字节,数据长度</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;BYTE&nbsp;&nbsp;&nbsp;&nbsp;checksum;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">1字节,校验和</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;data[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">];&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">0字节,</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">}COMM_PACK_REQUEST;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">共:20字节</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />typedef&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;_tag_COMM_PACK_RESPONSE<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;BYTE&nbsp;&nbsp;&nbsp;&nbsp;header[</span><span style="color: #000000; ">2</span><span style="color: #000000; ">];&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">2字节,协议头</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;UINT64&nbsp;&nbsp;&nbsp;&nbsp;responseID;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">8字节,流水号</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;BYTE&nbsp;&nbsp;&nbsp;&nbsp;entryType;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">1字节,加密类型</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;&nbsp;&nbsp;&nbsp;err;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">4字节,命令</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;&nbsp;&nbsp;&nbsp;dataLen;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">4字节,数据长度</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;BYTE&nbsp;&nbsp;&nbsp;&nbsp;checksum;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">1字节,校验和</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;data[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">];&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">0字节,</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">}COMM_PACK_RESPONSE;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">共:20字节</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">#pragma&nbsp;pack()<br /><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;COMM_PACK_REQUEST_SIZE&nbsp;&nbsp;&nbsp;&nbsp;sizeof(COMM_PACK_REQUEST)</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;COMM_PACK_RESPONSE_SIZE&nbsp;&nbsp;&nbsp;&nbsp;sizeof(COMM_PACK_RESPONSE)</span></div><img src ="http://www.cppblog.com/aaxron/aggbug/158137.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2011-10-12 16:01 <a href="http://www.cppblog.com/aaxron/archive/2011/10/12/158137.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux Socket阻塞模式服务端Demo 61.cpp</title><link>http://www.cppblog.com/aaxron/archive/2011/09/08/155363.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Thu, 08 Sep 2011 08:06:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2011/09/08/155363.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/155363.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2011/09/08/155363.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/155363.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/155363.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;File:&nbsp;61.cpp<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">客户端代码&nbsp;62.cpp</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.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; ">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; ">stdlib.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: #0000FF; ">string</span><span style="color: #000000; ">.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">strings.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; ">sys</span><span style="color: #000000; ">/</span><span style="color: #000000; ">types.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<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; ">&nbsp;<br />#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; ">&nbsp;<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 /><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;PORT&nbsp;1234&nbsp;&nbsp;&nbsp;/*&nbsp;Port&nbsp;that&nbsp;will&nbsp;be&nbsp;opened&nbsp;*/&nbsp;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;BACKLOG&nbsp;5&nbsp;&nbsp;&nbsp;/*&nbsp;Number&nbsp;of&nbsp;allowed&nbsp;connections&nbsp;*/&nbsp;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;MAXDATASIZE&nbsp;4096&nbsp;&nbsp;</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;process_cli(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;connectfd,</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr_in&nbsp;client);<br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main()&nbsp;&nbsp;{<br />&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;listenfd,&nbsp;connectfd;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;socket&nbsp;descriptors&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr_in&nbsp;server;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;server's&nbsp;address&nbsp;information&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr_in&nbsp;client;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;client's&nbsp;address&nbsp;information&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />&nbsp;socklen_t&nbsp;sin_size;&nbsp;<br /><br />&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Create&nbsp;TCP&nbsp;socket&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;((listenfd&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;socket(AF_INET,&nbsp;SOCK_STREAM,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">))&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;&nbsp;{<br />&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;handle&nbsp;exception&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Creating&nbsp;socket&nbsp;failed.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;exit(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br />&nbsp;}<br /><br />&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;opt&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;SO_REUSEADDR;<br />&nbsp;setsockopt(listenfd,&nbsp;SOL_SOCKET,&nbsp;SO_REUSEADDR,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">opt,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(opt));<br /><br />&nbsp;bzero(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">server,</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(server));<br />&nbsp;server.sin_family</span><span style="color: #000000; ">=</span><span style="color: #000000; ">AF_INET;&nbsp;<br />&nbsp;server.sin_port</span><span style="color: #000000; ">=</span><span style="color: #000000; ">htons(PORT);&nbsp;<br />&nbsp;server.sin_addr.s_addr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;htonl&nbsp;(INADDR_ANY);&nbsp;<br />&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(bind(listenfd,&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; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">server,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr))&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;{&nbsp;<br />&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;handle&nbsp;exception&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Bind&nbsp;error.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;exit(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);&nbsp;<br />&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(listen(listenfd,BACKLOG)&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">){&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;calls&nbsp;listen()&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">listen()&nbsp;error\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);&nbsp;<br />&nbsp;&nbsp;exit(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);&nbsp;<br />&nbsp;}&nbsp;<br /><br />&nbsp;sin_size</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr_in);&nbsp;<br />&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;((connectfd&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;accept(listenfd,(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">client,</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">sin_size))</span><span style="color: #000000; ">==-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">accept()&nbsp;error\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);&nbsp;<br />&nbsp;&nbsp;&nbsp;exit(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);&nbsp;<br />&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;process_cli(connectfd,&nbsp;client);<br />&nbsp;}<br /><br />&nbsp;close(listenfd);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}&nbsp;<br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;process_cli(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;connectfd,&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr_in&nbsp;client)<br />{<br />&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;num;<br />&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;recvbuf[MAXDATASIZE],&nbsp;sendbuf[MAXDATASIZE];<br /><br />&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;prints&nbsp;client's&nbsp;IP&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s:%d&nbsp;Client&nbsp;was&nbsp;connected\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,inet_ntoa(client.sin_addr),&nbsp;ntohs(&nbsp;client.sin_port)&nbsp;);<br /><br />&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;num&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;recv(connectfd,&nbsp;recvbuf,&nbsp;MAXDATASIZE,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(num&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;close(connectfd);<br />&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s:%d&nbsp;Client&nbsp;was&nbsp;disconnected&nbsp;\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,inet_ntoa(client.sin_addr),&nbsp;ntohs(&nbsp;client.sin_port)&nbsp;);<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(num&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">recv()&nbsp;error\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);&nbsp;<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">recvbuf[0]:%d,recvbuf[num-1]:%d,num:%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,recvbuf[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">],recvbuf[num</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">],num);<br />&nbsp;&nbsp;recvbuf[num]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">\0</span><span style="color: #000000; ">'</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Received&nbsp;message&nbsp;From&nbsp;Client&nbsp;:&nbsp;%s\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,recvbuf);<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;num;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;sendbuf[i]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;recvbuf[num</span><span style="color: #000000; ">-</span><span style="color: #000000; ">i</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">];<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">printf("sendbuf[%d]:%d\n",i,sendbuf[i]);</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;}<br />&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">printf("sendbuf[0]:%d,sendbuf[num-1]:%d,num:%d\n",sendbuf[0],sendbuf[num-1],num);</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;send(connectfd,sendbuf,num,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;send&nbsp;to&nbsp;the&nbsp;client&nbsp;welcome&nbsp;message&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />&nbsp;}<br />&nbsp;close(connectfd);&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;close&nbsp;connectfd&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />}<br /><br /><br />&nbsp;<br /></span></div><img src ="http://www.cppblog.com/aaxron/aggbug/155363.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2011-09-08 16:06 <a href="http://www.cppblog.com/aaxron/archive/2011/09/08/155363.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux Socket子进程模式服务端Demo 63.cpp</title><link>http://www.cppblog.com/aaxron/archive/2011/09/08/155362.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Thu, 08 Sep 2011 08:06:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2011/09/08/155362.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/155362.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2011/09/08/155362.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/155362.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/155362.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;File:&nbsp;63.cpp<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">客户端代码&nbsp;62.cpp</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.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; ">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; ">stdlib.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: #0000FF; ">string</span><span style="color: #000000; ">.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">strings.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; ">sys</span><span style="color: #000000; ">/</span><span style="color: #000000; ">types.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<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; ">&nbsp;<br />#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; ">&nbsp;<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 /><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;PORT&nbsp;1234&nbsp;&nbsp;&nbsp;/*&nbsp;Port&nbsp;that&nbsp;will&nbsp;be&nbsp;opened&nbsp;*/&nbsp;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;BACKLOG&nbsp;5&nbsp;&nbsp;&nbsp;/*&nbsp;Number&nbsp;of&nbsp;allowed&nbsp;connections&nbsp;*/&nbsp;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;MAXDATASIZE&nbsp;4096&nbsp;&nbsp;</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;process_cli(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;connectfd,</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr_in&nbsp;client);<br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main()&nbsp;<br />{&nbsp;<br />&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;listenfd,&nbsp;connectfd;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;socket&nbsp;descriptors&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />&nbsp;pid_t&nbsp;pid;<br />&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr_in&nbsp;server;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;server's&nbsp;address&nbsp;information&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr_in&nbsp;client;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;client's&nbsp;address&nbsp;information&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />&nbsp;socklen_t&nbsp;sin_size;&nbsp;<br /><br />&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Create&nbsp;TCP&nbsp;socket&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;((listenfd&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;socket(AF_INET,&nbsp;SOCK_STREAM,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">))&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;handle&nbsp;exception&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Creating&nbsp;socket&nbsp;failed.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;exit(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br />&nbsp;}<br /><br />&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;opt&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;SO_REUSEADDR;<br />&nbsp;setsockopt(listenfd,&nbsp;SOL_SOCKET,&nbsp;SO_REUSEADDR,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">opt,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(opt));<br /><br />&nbsp;bzero(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">server,</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(server));<br />&nbsp;server.sin_family</span><span style="color: #000000; ">=</span><span style="color: #000000; ">AF_INET;&nbsp;<br />&nbsp;server.sin_port</span><span style="color: #000000; ">=</span><span style="color: #000000; ">htons(PORT);&nbsp;<br />&nbsp;server.sin_addr.s_addr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;htonl(INADDR_ANY);&nbsp;<br />&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(bind(listenfd,&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; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">server,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr))&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;{&nbsp;<br />&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;handle&nbsp;exception&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Bind&nbsp;error.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;exit(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);&nbsp;<br />&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(listen(listenfd,BACKLOG)&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">){&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;calls&nbsp;listen()&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">listen()&nbsp;error\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);&nbsp;<br />&nbsp;&nbsp;exit(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);&nbsp;<br />&nbsp;}&nbsp;<br /><br />&nbsp;sin_size</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr_in);&nbsp;<br /><br />&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)<br />&nbsp;{<br />&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">accept&nbsp;connection&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;((connectfd&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;accept(listenfd,(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">client,</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">sin_size))</span><span style="color: #000000; ">==-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">accept()&nbsp;error\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);&nbsp;<br />&nbsp;&nbsp;&nbsp;exit(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);&nbsp;<br />&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;Create&nbsp;child&nbsp;process&nbsp;to&nbsp;service&nbsp;client&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;((pid</span><span style="color: #000000; ">=</span><span style="color: #000000; ">fork())</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;parent&nbsp;process&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;close(connectfd);<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">continue</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;}<br />&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;(pid</span><span style="color: #000000; ">==</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">child&nbsp;process</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;close(listenfd);<br />&nbsp;&nbsp;&nbsp;process_cli(connectfd,&nbsp;client);<br />&nbsp;&nbsp;&nbsp;exit(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">fork()&nbsp;error\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;exit(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;}<br />&nbsp;}<br />&nbsp;close(listenfd);&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;close&nbsp;listenfd&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}&nbsp;<br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;process_cli(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;connectfd,&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr_in&nbsp;client)<br />{<br />&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;num;<br />&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;recvbuf[MAXDATASIZE],&nbsp;sendbuf[MAXDATASIZE];<br /><br />&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;prints&nbsp;client's&nbsp;IP&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s:%d&nbsp;Client&nbsp;was&nbsp;connected\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,inet_ntoa(client.sin_addr),&nbsp;ntohs(&nbsp;client.sin_port)&nbsp;);<br /><br />&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;num&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;recv(connectfd,&nbsp;recvbuf,&nbsp;MAXDATASIZE,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(num&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;close(connectfd);<br />&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s:%d&nbsp;Client&nbsp;was&nbsp;disconnected&nbsp;\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,inet_ntoa(client.sin_addr),&nbsp;ntohs(&nbsp;client.sin_port)&nbsp;);<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(num&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">recv()&nbsp;error\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);&nbsp;<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">recvbuf[0]:%d,recvbuf[num-1]:%d,num:%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,recvbuf[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">],recvbuf[num</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">],num);<br />&nbsp;&nbsp;recvbuf[num]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">\0</span><span style="color: #000000; ">'</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Received&nbsp;message&nbsp;From&nbsp;Client&nbsp;:&nbsp;%s\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,recvbuf);<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;num;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;sendbuf[i]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;recvbuf[num</span><span style="color: #000000; ">-</span><span style="color: #000000; ">i</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">];<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">printf("sendbuf[%d]:%d\n",i,sendbuf[i]);</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;}<br />&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">printf("sendbuf[0]:%d,sendbuf[num-1]:%d,num:%d\n",sendbuf[0],sendbuf[num-1],num);</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;send(connectfd,sendbuf,num,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;send&nbsp;to&nbsp;the&nbsp;client&nbsp;welcome&nbsp;message&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />&nbsp;}<br />&nbsp;close(connectfd);&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;close&nbsp;connectfd&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />}<br /><br /><br />&nbsp;<br /></span></div><img src ="http://www.cppblog.com/aaxron/aggbug/155362.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2011-09-08 16:06 <a href="http://www.cppblog.com/aaxron/archive/2011/09/08/155362.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux Socket多线程模式服务端Demo 64.cpp</title><link>http://www.cppblog.com/aaxron/archive/2011/09/08/155361.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Thu, 08 Sep 2011 08:04:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2011/09/08/155361.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/155361.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2011/09/08/155361.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/155361.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/155361.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;File:&nbsp;64.cpp<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">g++&nbsp;-o&nbsp;64&nbsp;64.cpp&nbsp;-lpthread<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">客户端代码&nbsp;62.cpp</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.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; ">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; ">stdlib.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: #0000FF; ">string</span><span style="color: #000000; ">.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">strings.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; ">sys</span><span style="color: #000000; ">/</span><span style="color: #000000; ">types.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<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; ">&nbsp;<br />#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; ">&nbsp;<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 />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">pthread.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /><br /><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;PORT&nbsp;1234&nbsp;&nbsp;&nbsp;/*&nbsp;Port&nbsp;that&nbsp;will&nbsp;be&nbsp;opened&nbsp;*/&nbsp;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;BACKLOG&nbsp;5&nbsp;&nbsp;&nbsp;/*&nbsp;Number&nbsp;of&nbsp;allowed&nbsp;connections&nbsp;*/&nbsp;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;MAXDATASIZE&nbsp;4096&nbsp;&nbsp;</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;process_cli(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;connectfd,</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr_in&nbsp;client);<br /><br /></span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;function&nbsp;to&nbsp;be&nbsp;executed&nbsp;by&nbsp;the&nbsp;new&nbsp;thread&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;start_routine(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;arg);<br /></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;&nbsp;ARG&nbsp;&nbsp;{<br />&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;connfd;<br />&nbsp;sockaddr_in&nbsp;client;&nbsp;&nbsp;<br />};<br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main()&nbsp;<br />{&nbsp;<br />&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;listenfd,&nbsp;connectfd;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;socket&nbsp;descriptors&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />&nbsp;pthread_t&nbsp;&nbsp;thread;<br />&nbsp;ARG&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">arg;<br />&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr_in&nbsp;server;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;server's&nbsp;address&nbsp;information&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr_in&nbsp;client;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;client's&nbsp;address&nbsp;information&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />&nbsp;socklen_t&nbsp;sin_size;&nbsp;<br /><br />&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Create&nbsp;TCP&nbsp;socket&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;((listenfd&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;socket(AF_INET,&nbsp;SOCK_STREAM,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">))&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;handle&nbsp;exception&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Creating&nbsp;socket&nbsp;failed.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;exit(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br />&nbsp;}<br /><br />&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;opt&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;SO_REUSEADDR;<br />&nbsp;setsockopt(listenfd,&nbsp;SOL_SOCKET,&nbsp;SO_REUSEADDR,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">opt,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(opt));<br /><br />&nbsp;bzero(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">server,</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(server));<br />&nbsp;server.sin_family</span><span style="color: #000000; ">=</span><span style="color: #000000; ">AF_INET;&nbsp;<br />&nbsp;server.sin_port</span><span style="color: #000000; ">=</span><span style="color: #000000; ">htons(PORT);&nbsp;<br />&nbsp;server.sin_addr.s_addr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;htonl(INADDR_ANY);&nbsp;<br />&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(bind(listenfd,&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; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">server,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr))&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;{&nbsp;<br />&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;handle&nbsp;exception&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Bind&nbsp;error.</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;exit(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);&nbsp;<br />&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(listen(listenfd,BACKLOG)&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">){&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;calls&nbsp;listen()&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">listen()&nbsp;error\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);&nbsp;<br />&nbsp;&nbsp;exit(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);&nbsp;<br />&nbsp;}&nbsp;<br /><br />&nbsp;sin_size</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr_in);&nbsp;<br />&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)<br />&nbsp;{<br />&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Accept&nbsp;connection&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;((connectfd&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;accept(listenfd,(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">client,</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">sin_size))</span><span style="color: #000000; ">==-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">accept()&nbsp;error\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);&nbsp;<br />&nbsp;&nbsp;&nbsp;exit(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);&nbsp;<br />&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;Create&nbsp;thread</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /><br />&nbsp;&nbsp;arg&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ARG;<br />&nbsp;&nbsp;arg</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">connfd&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;connectfd;<br />&nbsp;&nbsp;memcpy((</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">arg</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">client,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">client,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(client));<br /><br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(pthread_create(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">thread,&nbsp;NULL,&nbsp;start_routine,&nbsp;(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)arg))&nbsp;{<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;handle&nbsp;exception&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Pthread_create()&nbsp;error</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;exit(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;}<br />&nbsp;}<br />&nbsp;close(listenfd);&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;close&nbsp;listenfd&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}&nbsp;<br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;process_cli(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;connectfd,&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr_in&nbsp;client)<br />{<br />&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;num;<br />&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;recvbuf[MAXDATASIZE],&nbsp;sendbuf[MAXDATASIZE];<br /><br />&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;prints&nbsp;client's&nbsp;IP&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s:%d&nbsp;Client&nbsp;was&nbsp;connected\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,inet_ntoa(client.sin_addr),&nbsp;ntohs(&nbsp;client.sin_port)&nbsp;);<br /><br />&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;num&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;recv(connectfd,&nbsp;recvbuf,&nbsp;MAXDATASIZE,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(num&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;close(connectfd);<br />&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s:%d&nbsp;Client&nbsp;was&nbsp;disconnected&nbsp;\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,inet_ntoa(client.sin_addr),&nbsp;ntohs(&nbsp;client.sin_port)&nbsp;);<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(num&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">recv()&nbsp;error\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);&nbsp;<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">recvbuf[0]:%d,recvbuf[num-1]:%d,num:%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,recvbuf[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">],recvbuf[num</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">],num);<br />&nbsp;&nbsp;recvbuf[num]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">\0</span><span style="color: #000000; ">'</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Received&nbsp;message&nbsp;From&nbsp;Client&nbsp;:&nbsp;%s\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,recvbuf);<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;num;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;sendbuf[i]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;recvbuf[num</span><span style="color: #000000; ">-</span><span style="color: #000000; ">i</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">];<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">printf("sendbuf[%d]:%d\n",i,sendbuf[i]);</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;}<br />&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">printf("sendbuf[0]:%d,sendbuf[num-1]:%d,num:%d\n",sendbuf[0],sendbuf[num-1],num);</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;send(connectfd,sendbuf,num,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;send&nbsp;to&nbsp;the&nbsp;client&nbsp;welcome&nbsp;message&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />&nbsp;}<br />&nbsp;close(connectfd);&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;close&nbsp;connectfd&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />}<br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;start_routine(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;arg)<br />{<br />&nbsp;ARG&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">info;<br />&nbsp;info&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(ARG&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)arg;<br /><br />&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;handle&nbsp;client&#8217;s&nbsp;requirement&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;process_cli(info</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">connfd,&nbsp;info</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">client);<br /><br />&nbsp;delete&nbsp;(ARG</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)arg;<br />&nbsp;pthread_exit(NULL);<br />}<br /><br />&nbsp;<br /></span></div><img src ="http://www.cppblog.com/aaxron/aggbug/155361.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2011-09-08 16:04 <a href="http://www.cppblog.com/aaxron/archive/2011/09/08/155361.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux Socket多路复用模式服务端 69.cpp</title><link>http://www.cppblog.com/aaxron/archive/2011/09/08/155360.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Thu, 08 Sep 2011 08:03:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2011/09/08/155360.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/155360.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2011/09/08/155360.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/155360.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/155360.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;File:&nbsp;69.cpp</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">#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; ">map</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; ">stdio.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; ">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; ">stdlib.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; ">math.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: #0000FF; ">string</span><span style="color: #000000; ">.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">strings.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; ">sys</span><span style="color: #000000; ">/</span><span style="color: #000000; ">types.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<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; ">&nbsp;<br />#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; ">&nbsp;<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 />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">bitset</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; ">&nbsp;std;<br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;PORT&nbsp;1234&nbsp;&nbsp;&nbsp;/*&nbsp;Port&nbsp;that&nbsp;will&nbsp;be&nbsp;opened&nbsp;*/&nbsp;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;BACKLOG&nbsp;5&nbsp;&nbsp;&nbsp;/*&nbsp;Number&nbsp;of&nbsp;allowed&nbsp;connections&nbsp;*/&nbsp;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;MAXDATASIZE&nbsp;4096&nbsp;&nbsp;</span><span style="color: #000000; "><br /><br />typedef&nbsp;map</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">unsigned&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">,sockaddr_in</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;connects;<br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;process_cli(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;sockfd,sockaddr_in&nbsp;addr,</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;recvbuf,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;len);<br /><br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;reverser(</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;szIn,</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;szOut,unsigned&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;nLen)&nbsp;<br />{<br />&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;i</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">nLen;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;szOut[i]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;szIn[nLen</span><span style="color: #000000; ">-</span><span style="color: #000000; ">i</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">];<br />&nbsp;}<br />}<br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main()&nbsp;<br />{&nbsp;<br />&nbsp;connects&nbsp;connect_fds;<br />&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;sock_fd;<br />&nbsp;ssize_t&nbsp;recv_size;<br />&nbsp;fd_set&nbsp;read_set;<br />&nbsp;fd_set&nbsp;all_set;<br />&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;listen_fd;<br />&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;connect_fd;<br />&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;ready_size;<br />&nbsp;socklen_t&nbsp;addr_size;&nbsp;<br />&nbsp;sockaddr_in&nbsp;srv_addr;<br />&nbsp;sockaddr_in&nbsp;addr;<br />&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;max_fd&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;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;recv_buf[MAXDATASIZE];<br /><br />&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;((listen_fd&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;socket(AF_INET,&nbsp;SOCK_STREAM,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">))&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Creating&nbsp;socket&nbsp;failed.</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;exit(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br />&nbsp;}<br /><br />&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;opt&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;SO_REUSEADDR;<br />&nbsp;setsockopt(listen_fd,&nbsp;SOL_SOCKET,&nbsp;SO_REUSEADDR,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">opt,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(opt));<br /><br />&nbsp;bzero(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">srv_addr,</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(srv_addr));<br />&nbsp;srv_addr.sin_family</span><span style="color: #000000; ">=</span><span style="color: #000000; ">AF_INET;&nbsp;<br />&nbsp;srv_addr.sin_port</span><span style="color: #000000; ">=</span><span style="color: #000000; ">htons(PORT);&nbsp;<br />&nbsp;srv_addr.sin_addr.s_addr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;htonl&nbsp;(INADDR_ANY);&nbsp;<br />&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(bind(listen_fd,&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; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">srv_addr,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr))&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;{&nbsp;<br />&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Bind&nbsp;error.</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;exit(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);&nbsp;<br />&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(listen(listen_fd,BACKLOG)&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">listen()&nbsp;error\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);&nbsp;<br />&nbsp;&nbsp;exit(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);&nbsp;<br />&nbsp;}&nbsp;<br />&nbsp;max_fd&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;listen_fd;<br />&nbsp;addr_size</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(sockaddr_in);&nbsp;<br />&nbsp;<br />&nbsp;FD_ZERO(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">all_set);<br />&nbsp;FD_SET(listen_fd,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">all_set);<br /><br />&nbsp;connects::iterator&nbsp;iter;<br /><br />&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">clients:(%u)&nbsp;,current&nbsp;listen&nbsp;socket:%u\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,connect_fds.size(),listen_fd);<br />&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)<br />&nbsp;{<br />&nbsp;&nbsp;read_set&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;all_set;<br />&nbsp;&nbsp;ready_size&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;select(max_fd</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">read_set,&nbsp;NULL,&nbsp;NULL,&nbsp;NULL);<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(&nbsp;FD_ISSET(listen_fd,</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">read_set)&nbsp;)&nbsp;{<br />&nbsp;&nbsp;&nbsp;connect_fd&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;accept(listen_fd,(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">addr,</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">addr_size);<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(connect_fd&nbsp;</span><span style="color: #000000; ">==-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">accept()&nbsp;error\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">continue</span><span style="color: #000000; ">;&nbsp;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;connect_fds[connect_fd]&nbsp;&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;addr;<br />&nbsp;&nbsp;&nbsp;max_fd&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;connect_fd;<br />&nbsp;&nbsp;&nbsp;FD_SET(connect_fd,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">all_set);<br />&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">clients:(%u)&nbsp;,%s:%d&nbsp;connected&nbsp;,connect&nbsp;socket:%u\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,connect_fds.size(),inet_ntoa(addr.sin_addr),ntohs(addr.sin_port),connect_fd);<br />&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(&nbsp;iter&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;connect_fds.begin();&nbsp;iter</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">connect_fds.end();&nbsp;iter</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;sock_fd&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;iter</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">first;<br />&nbsp;&nbsp;&nbsp;addr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;iter</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">second;<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(&nbsp;FD_ISSET(sock_fd,</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">read_set)&nbsp;)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;recv_size&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;recv(sock_fd,&nbsp;recv_buf,&nbsp;MAXDATASIZE,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(&nbsp;recv_size&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(sock_fd);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FD_CLR(sock_fd,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">all_set);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connect_fds.erase(sock_fd);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s:%d&nbsp;disconnected\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,inet_ntoa(addr.sin_addr),ntohs(addr.sin_port)&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;process_cli(sock_fd,addr,recv_buf,recv_size);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />&nbsp;}<br />&nbsp;close(listen_fd);<br />}&nbsp;<br /><br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;process_cli(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;sockfd,sockaddr_in&nbsp;addr,</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;recvbuf,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;len)<br />{<br />&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;sendbuf[MAXDATASIZE];<br />&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Received&nbsp;%s:%d&nbsp;message:&nbsp;%s\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,inet_ntoa(addr.sin_addr),ntohs(addr.sin_port),&nbsp;recvbuf);<br />&nbsp;reverser(recvbuf,sendbuf,len);<br />&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Send&nbsp;To&nbsp;&nbsp;%s:%d&nbsp;message:&nbsp;%s\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,inet_ntoa(addr.sin_addr),ntohs(addr.sin_port),&nbsp;sendbuf);<br />&nbsp;send(sockfd,sendbuf,len,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />}<br /></span></div><img src ="http://www.cppblog.com/aaxron/aggbug/155360.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2011-09-08 16:03 <a href="http://www.cppblog.com/aaxron/archive/2011/09/08/155360.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为 TCP socket 禁用 Nagle 算法</title><link>http://www.cppblog.com/aaxron/archive/2011/08/07/152717.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Sun, 07 Aug 2011 08:30:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2011/08/07/152717.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/152717.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2011/08/07/152717.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/152717.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/152717.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="background-color: #008000;">//</span><span style="color: #000000; background-color: #008000;">为&nbsp;TCP&nbsp;socket&nbsp;禁用&nbsp;Nagle&nbsp;算法</span><span style="color: #000000;"><br />　　</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Create&nbsp;new&nbsp;stream&nbsp;socket&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />　　sock&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;socket&nbsp;(&nbsp;AF_INET,&nbsp;SOCK_STREAM,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;);&nbsp;<br /><br />　　</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Disable&nbsp;the&nbsp;Nagle&nbsp;(TCP&nbsp;No&nbsp;Delay)&nbsp;algorithm&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />　　flag&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000;">;&nbsp;<br />　　</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> ret&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #ff0000;">setsockopt&nbsp;</span><span style="color: #000000;">(&nbsp;sock,&nbsp;IPPROTO_TCP,&nbsp;TCP_NODELAY,&nbsp;(</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">flag,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(flag)&nbsp;);&nbsp;<br /><br />　　</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(ret&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000;">)&nbsp;{&nbsp;<br />　　</span>&nbsp;&nbsp; <span style="color: #000000; ">printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Couldn't&nbsp;setsockopt(TCP_NODELAY)\n</span><span style="color: #000000; ">"</span><span style="color: #000000;">);&nbsp;<br />　　</span>&nbsp;&nbsp; <span style="color: #000000; ">exit(</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);&nbsp;<br />　　} <br /></span></div><img src ="http://www.cppblog.com/aaxron/aggbug/152717.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2011-08-07 16:30 <a href="http://www.cppblog.com/aaxron/archive/2011/08/07/152717.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用KeepAlive检测网络异常</title><link>http://www.cppblog.com/aaxron/archive/2011/08/07/152703.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Sun, 07 Aug 2011 03:20:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2011/08/07/152703.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/152703.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2011/08/07/152703.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/152703.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/152703.html</trackback:ping><description><![CDATA[<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<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">"</span><span style="color: #000000">netinet/tcp.h</span><span style="color: #000000">"</span><span style="color: #000000"><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;keepAlive&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">设定KeepAlive</span><span style="color: #008000"><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;keepIdle&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">30</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">开始首次KeepAlive探测前的TCP空闭时间</span><span style="color: #008000"><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;keepInterval&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">30</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">两次KeepAlive探测间的时间间隔</span><span style="color: #008000"><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;keepCount&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">判定断开前的KeepAlive探测次数</span><span style="color: #008000"><br /></span><span style="color: #000000"><br /></span><span style="color: #0000ff">if</span><span style="color: #000000">(setsockopt(sockfd,SOL_SOCKET,SO_KEEPALIVE,(</span><span style="color: #0000ff">void</span><span style="color: #000000">*</span><span style="color: #000000">)</span><span style="color: #000000">&amp;</span><span style="color: #000000">keepAlive,</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(keepAlive))&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">Socket&nbsp;Option&nbsp;setting(SO_KEEPALIVE)&nbsp;fail&nbsp;!\n</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;FALSE;<br />}<br /><br /></span><span style="color: #0000ff">if</span><span style="color: #000000">(setsockopt(sockfd,SOL_TCP,TCP_KEEPIDLE,(</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)</span><span style="color: #000000">&amp;</span><span style="color: #000000">keepIdle,</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(keepIdle))&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">Socket&nbsp;Option&nbsp;setting(SO_KEEPALIVE)&nbsp;fail&nbsp;!\n</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;FALSE;<br />}<br /><br /></span><span style="color: #0000ff">if</span><span style="color: #000000">(setsockopt(sockfd,SOL_TCP,TCP_KEEPINTVL,(</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)</span><span style="color: #000000">&amp;</span><span style="color: #000000">keepInterval,</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(keepInterval))&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">Socket&nbsp;Option&nbsp;setting(TCP_KEEPIDLE)&nbsp;fail&nbsp;!\n</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;FALSE;<br />}<br /><br /></span><span style="color: #0000ff">if</span><span style="color: #000000">(setsockopt(sockfd,SOL_TCP,TCP_KEEPCNT,(</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)</span><span style="color: #000000">&amp;</span><span style="color: #000000">keepCount,</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(keepCount))&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">Socket&nbsp;Option&nbsp;setting(TCP_KEEPCNT)&nbsp;fail&nbsp;!\n</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;FALSE;<br />}<br /></span></div><img src ="http://www.cppblog.com/aaxron/aggbug/152703.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2011-08-07 11:20 <a href="http://www.cppblog.com/aaxron/archive/2011/08/07/152703.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>字节顺序：高位优先(big-endian)和低位优先(little-endian)</title><link>http://www.cppblog.com/aaxron/archive/2011/02/28/140786.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Mon, 28 Feb 2011 05:07:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2011/02/28/140786.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/140786.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2011/02/28/140786.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/140786.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/140786.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-family: Lucida Console; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000;">&nbsp;<br />
<p style="line-height: 18pt; background: #fafafa"><font face="宋体"><span style="font-size: 10.5pt; mso-ascii-font-family: 'DejaVu Sans Mono'; mso-bidi-font-family: 'DejaVu Sans Mono'">字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序，通常有小端、大端两种字节顺序。</span><span style="font-family: 'DejaVu Sans Mono'; font-size: 10.5pt" lang="EN-US"><o:p></o:p></span></font></p>
<p style="line-height: 18pt; background: #fafafa"><font face="宋体"><span style="font-size: 10.5pt; mso-ascii-font-family: 'DejaVu Sans Mono'; mso-bidi-font-family: 'DejaVu Sans Mono'">小端字节序指低字节数据存放在内存低地址处，高字节数据存放在内存高地址处；</span><span style="font-family: 'DejaVu Sans Mono'; font-size: 10.5pt" lang="EN-US"><o:p></o:p></span></font></p>
<p style="line-height: 18pt; background: #fafafa"><font face="宋体"><span style="font-size: 10.5pt; mso-ascii-font-family: 'DejaVu Sans Mono'; mso-bidi-font-family: 'DejaVu Sans Mono'">大端字节序是高字节数据存放在低地址处，低字节数据存放在高地址处。</span><span style="font-family: 'DejaVu Sans Mono'; font-size: 10.5pt" lang="EN-US"><o:p></o:p></span></font></p>
<p style="line-height: 18pt; background: none repeat scroll 0% 0% #fafafa;"><span style="letter-spacing: 0.3pt; font-size: 10.5pt; mso-ascii-font-family: 'DejaVu Sans Mono'; mso-bidi-font-family: 'DejaVu Sans Mono'"><font face="宋体">基于</font></span><span style="font-family: 'DejaVu Sans Mono'; letter-spacing: 0.3pt; font-size: 10.5pt" lang="EN-US">X86</span><span style="letter-spacing: 0.3pt; font-size: 10.5pt; mso-ascii-font-family: 'DejaVu Sans Mono'; mso-bidi-font-family: 'DejaVu Sans Mono'"><font face="宋体">平台的</font></span><span style="font-family: 'DejaVu Sans Mono'; letter-spacing: 0.3pt; font-size: 10.5pt" lang="EN-US">PC</span><span style="letter-spacing: 0.3pt; font-size: 10.5pt;"><font face="宋体">机是小端字节序的</font></span></p></span><span style="color: #000000"><p style="line-height: 18pt; background: #fafafa"> <p>网络字节序: <span style="color: red;">MSB </span>高字节前存法 Most Significant Bit&nbsp;&nbsp; (Big Edian)</p> <p>主机字节序: <span style="color: red;">LSB </span>低字节前存法 Lest Significant  Bit&nbsp; (Little Edian)</p><span style="letter-spacing: 0.3pt; font-size: 10.5pt; mso-ascii-font-family: 'DejaVu Sans Mono'; mso-bidi-font-family: 'DejaVu Sans Mono'"></span><span style="font-family: 'DejaVu Sans Mono'; font-size: 10.5pt" lang="EN-US"><o:p></o:p></span></p>
<p><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;因为现行的计算机都是以八位一个字节为存储单位，那么一个16位的整数，也就是C语言中的short，在内存中可能有两种存储顺序big<span style="color: #000000">-</span><span style="color: #000000">endian和litte</span><span style="color: #000000">-</span><span style="color: #000000">endian。考虑一个short整数0x3132(0x32是低位，0x31是高位)，把它赋值给一个short变量，那么它在内存中的存储可能有如下两种情况：<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><img src="http://www.cppblog.com/images/cppblog_com/aaxron/16520/o_大小端.png" alt="" border="0" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" alt="" align="top" />可以做个实验<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" alt="" align="top" />在Windows上下如下程序<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" alt="" align="top" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdio.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" alt="" align="top" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">assert.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main(</span><span style="color: #0000ff">void</span><span style="color: #000000">)<br /><img id="Codehighlighter1_793_1067_Open_Image" onclick="this.style.display='none'; Codehighlighter1_793_1067_Open_Text.style.display='none'; Codehighlighter1_793_1067_Closed_Image.style.display='inline'; Codehighlighter1_793_1067_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img style="display: none" id="Codehighlighter1_793_1067_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_793_1067_Closed_Text.style.display='none'; Codehighlighter1_793_1067_Open_Image.style.display='inline'; Codehighlighter1_793_1067_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_793_1067_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_793_1067_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">short</span><span style="color: #000000">&nbsp;test;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FILE</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;fp;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img id="Codehighlighter1_866_899_Open_Image" onclick="this.style.display='none'; Codehighlighter1_866_899_Open_Text.style.display='none'; Codehighlighter1_866_899_Closed_Image.style.display='inline'; Codehighlighter1_866_899_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img style="display: none" id="Codehighlighter1_866_899_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_866_899_Closed_Text.style.display='none'; Codehighlighter1_866_899_Open_Image.style.display='inline'; Codehighlighter1_866_899_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0x3132</span><span style="color: #000000">;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_866_899_Closed_Text">/**/</span><span id="Codehighlighter1_866_899_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;(31ASIIC码的'1',&nbsp;32ASIIC码的'2')&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;((fp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;fopen(</span><span style="color: #000000">"</span><span style="color: #000000">c:\\test.txt</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">wb</span><span style="color: #000000">"</span><span style="color: #000000">))&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;NULL)<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assert(</span><span style="color: #000000">0</span><span style="color: #000000">);<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fwrite(</span><span style="color: #000000">&amp;</span><span style="color: #000000">test,&nbsp;</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(</span><span style="color: #0000ff">short</span><span style="color: #000000">),&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;fp);<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fclose(fp);<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&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 /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />}</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;然后在C盘下打开test.txt文件，可以看见内容是21，而test等于0x3132，可以明显的看出来x86的字节顺序是低位在前。如果我们把这段同样的代码放到(big</span><span style="color: #000000">-</span><span style="color: #000000">endian)的机器上执行，那么打出来的文件就是12。这在本机中使用是没有问题的。但当你把这个文件从一个big</span><span style="color: #000000">-</span><span style="color: #000000">endian机器复制到一个little</span><span style="color: #000000">-</span><span style="color: #000000">endian机器上时就出现问题了。<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;如上述例子，我们在big</span><span style="color: #000000">-</span><span style="color: #000000">endian的机器上创建了这个test文件，把其复制到little</span><span style="color: #000000">-</span><span style="color: #000000">endian的机器上再用fread读到一个short里面，我们得到的就不再是0x3132而是0x3231了，这样读到的数据就是错误的，所以在两个字节顺序不一样的机器上传输数据时需要特别小心字节顺序，理解了字节顺序在可以帮助我们写出移植行更高的代码。<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" alt="" align="top" />正因为有字节顺序的差别，所以在网络传输的时候定义了所有字节顺序相关的数据都使用big</span><span style="color: #000000">-</span><span style="color: #000000">endian，BSD的代码中定义了四个宏来理：<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;ntohs(n)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">网络字节顺序到主机字节顺序&nbsp;n代表net,&nbsp;h代表host,&nbsp;s代表short</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;htons(n)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">主机字节顺序到网络字节顺序&nbsp;n代表net,&nbsp;h代表host,&nbsp;s代表short</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;ntohl(n)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">网络字节顺序到主机字节顺序&nbsp;n代表net,&nbsp;h代表host,&nbsp;s代表long</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;htonl(n)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">主机字节顺序到网络字节顺序&nbsp;n代表net,&nbsp;h代表host,&nbsp;s代表long</span></p>
</span></div><img src ="http://www.cppblog.com/aaxron/aggbug/140786.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2011-02-28 13:07 <a href="http://www.cppblog.com/aaxron/archive/2011/02/28/140786.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sockaddr 和 sockaddr_in 类型指针转换分析</title><link>http://www.cppblog.com/aaxron/archive/2011/01/11/138356.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Tue, 11 Jan 2011 13:19:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2011/01/11/138356.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/138356.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2011/01/11/138356.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/138356.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/138356.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; HEIGHT: 323px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000">#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">afxwin.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">Winsock2.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#pragma&nbsp;comment(lib,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Ws2_32.lib</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(){<br>&nbsp;&nbsp;&nbsp;&nbsp;sockaddr_in&nbsp;addrSock1;<br>&nbsp;&nbsp;&nbsp;&nbsp;addrSock1.sin_family&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;AF_INET;<br>&nbsp;&nbsp;&nbsp;&nbsp;addrSock1.sin_port&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;htons(</span><span style="COLOR: #000000">5555</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;addrSock1.sin_addr.s_addr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;inet_addr(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">127.0.0.1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;sockaddr</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;addrSock2;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;addrSock2&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(sockaddr</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">addrSock1;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;u_long&nbsp;uPort1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;htons(</span><span style="COLOR: #000000">5555</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;u_long&nbsp;uPort2&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;MAKEWORD(addrSock2</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">sa_data[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">],addrSock2</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">sa_data[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]);<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>}<br><br>//注意 addSock2-&gt;sa_data[0],addSock2-&gt;sa_data[1]及MAKEWORD</span></div>
<img src ="http://www.cppblog.com/aaxron/aggbug/138356.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2011-01-11 21:19 <a href="http://www.cppblog.com/aaxron/archive/2011/01/11/138356.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原创]封装了个基于Libcurl的类,大家评评,尽情拍砖.</title><link>http://www.cppblog.com/aaxron/archive/2010/11/18/133975.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Thu, 18 Nov 2010 06:15:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2010/11/18/133975.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/133975.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2010/11/18/133975.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/133975.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/133975.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: [原创]封装了个基于Libcurl的类,大家评评,尽情拍砖.Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->&nbsp;&nbsp;1&nbsp;#pragma&nbsp;once&nbsp;&nbsp;2&nbsp;#include&nbsp;&...&nbsp;&nbsp;<a href='http://www.cppblog.com/aaxron/archive/2010/11/18/133975.html'>阅读全文</a><img src ="http://www.cppblog.com/aaxron/aggbug/133975.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2010-11-18 14:15 <a href="http://www.cppblog.com/aaxron/archive/2010/11/18/133975.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>