📄 socketft_8cpp-source.html
字号:
<a name="l00120"></a>00120 <a class="code" href="class_socket.html#ebf290bcbd37f0711fcb56373b4f8f88">CheckAndHandleError_int</a>(<span class="stringliteral">"bind"</span>, bind(<a class="code" href="class_socket.html#2a82c6dd3794c4d45e33e68f2112df35">m_s</a>, const_cast<sockaddr *>(psa), saLen));<a name="l00121"></a>00121 }<a name="l00122"></a>00122 <a name="l00123"></a><a class="code" href="class_socket.html#a0f96de45801e101b226a9954ae34d74">00123</a> <span class="keywordtype">void</span> <a class="code" href="class_socket.html#a0f96de45801e101b226a9954ae34d74">Socket::Listen</a>(<span class="keywordtype">int</span> backlog)<a name="l00124"></a>00124 {<a name="l00125"></a>00125 assert(<a class="code" href="class_socket.html#2a82c6dd3794c4d45e33e68f2112df35">m_s</a> != INVALID_SOCKET);<a name="l00126"></a>00126 <a class="code" href="class_socket.html#ebf290bcbd37f0711fcb56373b4f8f88">CheckAndHandleError_int</a>(<span class="stringliteral">"listen"</span>, listen(<a class="code" href="class_socket.html#2a82c6dd3794c4d45e33e68f2112df35">m_s</a>, backlog));<a name="l00127"></a>00127 }<a name="l00128"></a>00128 <a name="l00129"></a><a class="code" href="class_socket.html#f6db2452bbe371340e748744e0600e43">00129</a> <span class="keywordtype">bool</span> <a class="code" href="class_socket.html#f6db2452bbe371340e748744e0600e43">Socket::Connect</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *addr, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> port)<a name="l00130"></a>00130 {<a name="l00131"></a>00131 assert(addr != NULL);<a name="l00132"></a>00132 <a name="l00133"></a>00133 sockaddr_in sa;<a name="l00134"></a>00134 memset(&sa, 0, <span class="keyword">sizeof</span>(sa));<a name="l00135"></a>00135 sa.sin_family = AF_INET;<a name="l00136"></a>00136 sa.sin_addr.s_addr = inet_addr(addr);<a name="l00137"></a>00137 <a name="l00138"></a>00138 <span class="keywordflow">if</span> (sa.sin_addr.s_addr == -1) <span class="comment">// Solaris doesn't have INADDR_NONE</span><a name="l00139"></a>00139 {<a name="l00140"></a>00140 hostent *lphost = gethostbyname(addr);<a name="l00141"></a>00141 <span class="keywordflow">if</span> (lphost == NULL)<a name="l00142"></a>00142 {<a name="l00143"></a>00143 <a class="code" href="class_socket.html#8c34f549b69c55bf0ee4c04ea8890bef" title="sets errno or calls WSASetLastError">SetLastError</a>(SOCKET_EINVAL);<a name="l00144"></a>00144 <a class="code" href="class_socket.html#ebf290bcbd37f0711fcb56373b4f8f88">CheckAndHandleError_int</a>(<span class="stringliteral">"gethostbyname"</span>, SOCKET_ERROR);<a name="l00145"></a>00145 }<a name="l00146"></a>00146 <a name="l00147"></a>00147 sa.sin_addr.s_addr = ((in_addr *)lphost->h_addr)->s_addr;<a name="l00148"></a>00148 }<a name="l00149"></a>00149 <a name="l00150"></a>00150 sa.sin_port = htons((u_short)port);<a name="l00151"></a>00151 <a name="l00152"></a>00152 <span class="keywordflow">return</span> <a class="code" href="class_socket.html#f6db2452bbe371340e748744e0600e43">Connect</a>((<span class="keyword">const</span> sockaddr *)&sa, <span class="keyword">sizeof</span>(sa));<a name="l00153"></a>00153 }<a name="l00154"></a>00154 <a name="l00155"></a><a class="code" href="class_socket.html#3e379f47deb48d113df6d782b3214572">00155</a> <span class="keywordtype">bool</span> <a class="code" href="class_socket.html#f6db2452bbe371340e748744e0600e43">Socket::Connect</a>(<span class="keyword">const</span> sockaddr* psa, socklen_t saLen)<a name="l00156"></a>00156 {<a name="l00157"></a>00157 assert(<a class="code" href="class_socket.html#2a82c6dd3794c4d45e33e68f2112df35">m_s</a> != INVALID_SOCKET);<a name="l00158"></a>00158 <span class="keywordtype">int</span> result = connect(<a class="code" href="class_socket.html#2a82c6dd3794c4d45e33e68f2112df35">m_s</a>, const_cast<sockaddr*>(psa), saLen);<a name="l00159"></a>00159 <span class="keywordflow">if</span> (result == SOCKET_ERROR && <a class="code" href="class_socket.html#9cf0d25a9da54bbe641dbb89bee452bc" title="returns errno or WSAGetLastError">GetLastError</a>() == SOCKET_EWOULDBLOCK)<a name="l00160"></a>00160 <span class="keywordflow">return</span> <span class="keyword">false</span>;<a name="l00161"></a>00161 <a class="code" href="class_socket.html#ebf290bcbd37f0711fcb56373b4f8f88">CheckAndHandleError_int</a>(<span class="stringliteral">"connect"</span>, result);<a name="l00162"></a>00162 <span class="keywordflow">return</span> <span class="keyword">true</span>;<a name="l00163"></a>00163 }<a name="l00164"></a>00164 <a name="l00165"></a><a class="code" href="class_socket.html#49b3cbb0430f638355a066566e243d3f">00165</a> <span class="keywordtype">bool</span> <a class="code" href="class_socket.html#49b3cbb0430f638355a066566e243d3f">Socket::Accept</a>(<a class="code" href="class_socket.html" title="wrapper for Windows or Berkeley Sockets">Socket</a>& target, sockaddr *psa, socklen_t *psaLen)<a name="l00166"></a>00166 {<a name="l00167"></a>00167 assert(<a class="code" href="class_socket.html#2a82c6dd3794c4d45e33e68f2112df35">m_s</a> != INVALID_SOCKET);<a name="l00168"></a>00168 socket_t s = accept(<a class="code" href="class_socket.html#2a82c6dd3794c4d45e33e68f2112df35">m_s</a>, psa, psaLen);<a name="l00169"></a>00169 <span class="keywordflow">if</span> (s == INVALID_SOCKET && <a class="code" href="class_socket.html#9cf0d25a9da54bbe641dbb89bee452bc" title="returns errno or WSAGetLastError">GetLastError</a>() == SOCKET_EWOULDBLOCK)<a name="l00170"></a>00170 <span class="keywordflow">return</span> <span class="keyword">false</span>;<a name="l00171"></a>00171 <a class="code" href="class_socket.html#c29e3d5e0acd2d8d6c7fd59a7cc4bd40">CheckAndHandleError</a>(<span class="stringliteral">"accept"</span>, s);<a name="l00172"></a>00172 target.<a class="code" href="class_socket.html#02a47851259d4a225958441d1b4dd37a">AttachSocket</a>(s, <span class="keyword">true</span>);<a name="l00173"></a>00173 <span class="keywordflow">return</span> <span class="keyword">true</span>;<a name="l00174"></a>00174 }<a name="l00175"></a>00175 <a name="l00176"></a><a class="code" href="class_socket.html#eeee4469c3eeae609728e88113276545">00176</a> <span class="keywordtype">void</span> <a class="code" href="class_socket.html#eeee4469c3eeae609728e88113276545">Socket::GetSockName</a>(sockaddr *psa, socklen_t *psaLen)<a name="l00177"></a>00177 {<a name="l00178"></a>00178 assert(<a class="code" href="class_socket.html#2a82c6dd3794c4d45e33e68f2112df35">m_s</a> != INVALID_SOCKET);<a name="l00179"></a>00179 <a class="code" href="class_socket.html#ebf290bcbd37f0711fcb56373b4f8f88">CheckAndHandleError_int</a>(<span class="stringliteral">"getsockname"</span>, getsockname(<a class="code" href="class_socket.html#2a82c6dd3794c4d45e33e68f2112df35">m_s</a>, psa, psaLen));<a name="l00180"></a>00180 }<a name="l00181"></a>00181 <a name="l00182"></a><a class="code" href="class_socket.html#abe0ad8b636dbb2f2d0fff8ab14df8a7">00182</a> <span class="keywordtype">void</span> <a class="code" href="class_socket.html#abe0ad8b636dbb2f2d0fff8ab14df8a7">Socket::GetPeerName</a>(sockaddr *psa, socklen_t *psaLen)<a name="l00183"></a>00183 {<a name="l00184"></a>00184 assert(<a class="code" href="class_socket.html#2a82c6dd3794c4d45e33e68f2112df35">m_s</a> != INVALID_SOCKET);<a name="l00185"></a>00185 <a class="code" href="class_socket.html#ebf290bcbd37f0711fcb56373b4f8f88">CheckAndHandleError_int</a>(<span class="stringliteral">"getpeername"</span>, getpeername(<a class="code" href="class_socket.html#2a82c6dd3794c4d45e33e68f2112df35">m_s</a>, psa, psaLen));<a name="l00186"></a>00186 }<a name="l00187"></a>00187 <a name="l00188"></a><a class="code" href="class_socket.html#3f0f142b8773be9129b4664686a00463">00188</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_socket.html#3f0f142b8773be9129b4664686a00463">Socket::Send</a>(<span class="keyword">const</span> byte* buf, <span class="keywordtype">size_t</span> bufLen, <span class="keywordtype">int</span> flags)<a name="l00189"></a>00189 {<a name="l00190"></a>00190 assert(<a class="code" href="class_socket.html#2a82c6dd3794c4d45e33e68f2112df35">m_s</a> != INVALID_SOCKET);<a name="l00191"></a>00191 <span class="keywordtype">int</span> result = send(<a class="code" href="class_socket.html#2a82c6dd3794c4d45e33e68f2112df35">m_s</a>, (<span class="keyword">const</span> <span class="keywordtype">char</span> *)buf, UnsignedMin(INT_MAX, bufLen), flags);<a name="l00192"></a>00192 <a class="code" href="class_socket.html#ebf290bcbd37f0711fcb56373b4f8f88">CheckAndHandleError_int</a>(<span class="stringliteral">"send"</span>, result);<a name="l00193"></a>00193 <span class="keywordflow">return</span> result;<a name="l00194"></a>00194 }<a name="l00195"></a>00195 <a name="l00196"></a><a class="code" href="class_socket.html#70da2e36472cbdf892f9b53f61bf807e">00196</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_socket.html#70da2e36472cbdf892f9b53f61bf807e">Socket::Receive</a>(byte* buf, <span class="keywordtype">size_t</span> bufLen, <span class="keywordtype">int</span> flags)<a name="l00197"></a>00197 {<a name="l00198"></a>00198 assert(<a class="code" href="class_socket.html#2a82c6dd3794c4d45e33e68f2112df35">m_s</a> != INVALID_SOCKET);<a name="l00199"></a>00199 <span class="keywordtype">int</span> result = recv(<a class="code" href="class_socket.html#2a82c6dd3794c4d45e33e68f2112df35">m_s</a>, (<span class="keywordtype">char</span> *)buf, UnsignedMin(INT_MAX, bufLen), flags);<a name="l00200"></a>00200 <a class="code" href="class_socket.html#ebf290bcbd37f0711fcb56373b4f8f88">CheckAndHandleError_int</a>(<span class="stringliteral">"recv"</span>, result);<a name="l00201"></a>00201 <span class="keywordflow">return</span> result;<a name="l00202"></a>00202 }<a name="l00203"></a>00203 <a name="l00204"></a><a class="code" href="class_socket.html#44fa23c55391354e5ce763810048f534">00204</a> <span class="keywordtype">void</span> <a class="code" href="class_socket.html#44fa23c55391354e5ce763810048f534">Socket::ShutDown</a>(<span class="keywordtype">int</span> how)<a name="l00205"></a>00205 {<a name="l00206"></a>00206 assert(<a class="code" href="class_socket.html#2a82c6dd3794c4d45e33e68f2112df35">m_s</a> != INVALID_SOCKET);<a name="l00207"></a>00207 <span class="keywordtype">int</span> result = shutdown(<a class="code" href="class_socket.html#2a82c6dd3794c4d45e33e68f2112df35">m_s</a>, how);<a name="l00208"></a>00208 <a class="code" href="class_socket.html#ebf290bcbd37f0711fcb56373b4f8f88">CheckAndHandleError_int</a>(<span class="stringliteral">"shutdown"</span>, result);<a name="l00209"></a>00209 }<a name="l00210"></a>00210 <a name="l00211"></a><a class="code" href="class_socket.html#0b0126a0be1b112f59c7defab74e8230">00211</a> <span class="keywordtype">void</span> <a class="code" href="class_socket.html#0b0126a0be1b112f59c7defab74e8230">Socket::IOCtl</a>(<span class="keywordtype">long</span> cmd, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> *argp)<a name="l00212"></a>00212 {<a name="l00213"></a>00213 assert(<a class="code" href="class_socket.html#2a82c6dd3794c4d45e33e68f2112df35">m_s</a> != INVALID_SOCKET);<a name="l00214"></a>00214 <span class="preprocessor">#ifdef USE_WINDOWS_STYLE_SOCKETS</span><a name="l00215"></a>00215 <span class="preprocessor"></span> <a class="code" href="class_socket.html#ebf290bcbd37f0711fcb56373b4f8f88">CheckAndHandleError_int</a>(<span class="stringliteral">"ioctlsocket"</span>, ioctlsocket(<a class="code" href="class_socket.html#2a82c6dd3794c4d45e33e68f2112df35">m_s</a>, cmd, argp));<a name="l00216"></a>00216 <span class="preprocessor">#else</span><a name="l00217"></a>00217 <span class="preprocessor"></span> <a class="code" href="class_socket.html#ebf290bcbd37f0711fcb56373b4f8f88">CheckAndHandleError_int</a>(<span class="stringliteral">"ioctl"</span>, ioctl(<a class="code" href="class_socket.html#2a82c6dd3794c4d45e33e68f2112df35">m_s</a>, cmd, argp));<a name="l00218"></a>00218 <span class="preprocessor">#endif</span><a name="l00219"></a>00219 <span class="preprocessor"></span>}<a name="l00220"></a>00220 <a name="l00221"></a><a class="code" href="class_socket.html#5e36546ea37ec18ac0bdb5ae4ac8576b">00221</a> <span class="keywordtype">bool</span> <a class="code" href="class_socket.html#5e36546ea37ec18ac0bdb5ae4ac8576b">Socket::SendReady</a>(<span class="keyword">const</span> timeval *timeout)<a name="l00222"></a>00222 {<a name="l00223"></a>00223 fd_set fds;<a name="l00224"></a>00224 FD_ZERO(&fds);<a name="l00225"></a>00225 FD_SET(<a class="code" href="class_socket.html#2a82c6dd3794c4d45e33e68f2112df35">m_s</a>, &fds);<a name="l00226"></a>00226 <span class="keywordtype">int</span> ready;<a name="l00227"></a>00227 <span class="keywordflow">if</span> (timeout == NULL)<a name="l00228"></a>00228 ready = select((<span class="keywordtype">int</span>)<a class="code" href="class_socket.html#2a82c6dd3794c4d45e33e68f2112df35">m_s</a>+1, NULL, &fds, NULL, NULL);<a name="l00229"></a>00229 <span class="keywordflow">else</span><a name="l00230"></a>00230 {<a name="l00231"></a>00231 timeval timeoutCopy = *timeout; <span class="comment">// select() modified timeout on Linux</span><a name="l00232"></a>00232 ready = select((<span class="keywordtype">int</span>)<a class="code" href="class_socket.html#2a82c6dd3794c4d45e33e68f2112df35">m_s</a>+1, NULL, &fds, NULL, &timeoutCopy);<a name="l00233"></a>00233 }<a name="l00234"></a>00234 <a class="code" href="class_socket.html#ebf290bcbd37f0711fcb56373b4f8f88">CheckAndHandleError_int</a>(<span class="stringliteral">"select"</span>, ready);<a name="l00235"></a>00235 <span class="keywordflow">return</span> ready > 0;<a name="l00236"></a>00236 }<a name="l00237"></a>00237 <a name="l00238"></a><a class="code" href="class_socket.html#e44e8895720eaada63131354415b6ba3">00238</a> <span class="keywordtype">bool</span> <a class="code" href="class_socket.html#e44e8895720eaada63131354415b6ba3">Socket::ReceiveReady</a>(<span class="keyword">const</span> timeval *timeout)<a name="l00239"></a>00239 {<a name="l00240"></a>00240 fd_set fds;<a name="l00241"></a>00241 FD_ZERO(&fds);<a name="l00242"></a>00242 FD_SET(<a class="code" href="class_socket.html#2a82c6dd3794c4d45e33e68f2112df35">m_s</a>, &fds);<a name="l00243"></a>00243 <span class="keywordtype">int</span> ready;<a name="l00244"></a>00244 <span class="keywordflow">if</span> (timeout == NULL)<a name="l00245"></a>00245 ready = select((<span class="keywordtype">int</span>)<a class="code" href="class_socket.html#2a82c6dd3794c4d45e33e68f2112df35">m_s</a>+1, &fds, NULL, NULL, NULL);<a name="l00246"></a>00246 <span class="keywordflow">else</span><a name="l00247"></a>00247 {<a name="l00248"></a>00248 timeval timeoutCopy = *timeout; <span class="comment">// select() modified timeout on Linux</span><a name="l00249"></a>00249 ready = select((<span class="keywordtype">int</span>)<a class="code" href="class_socket.html#2a82c6dd3794c4d45e33e68f2112df35">m_s</a>+1, &fds, NULL, NULL, &timeoutCopy);<a name="l00250"></a>00250 }<a name="l00251"></a>00251 <a class="code" href="class_socket.html#ebf290bcbd37f0711fcb56373b4f8f88">CheckAndHandleError_int</a>(<span class="stringliteral">"select"</span>, ready);<a name="l00252"></a>00252 <span class="keywordflow">return</span> ready > 0;<a name="l00253"></a>00253 }<a name="l00254"></a>00254 <a name="l00255"></a><a class="code" href="class_socket.html#6417cdd4aec086457b67eb34d0964f57">00255</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_socket.html#6417cdd4aec086457b67eb34d0964f57" title="look up the port number given its name, returns 0 if not found">Socket::PortNameToNumber</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *name, <span class="keyword">const</span> <span class="keywordtype">char</span> *protocol)<a name="l00256"></a>00256 {<a name="l00257"></a>00257 <span class="keywordtype">int</span> port = atoi(name);<a name="l00258"></a>00258 <span class="keywordflow">if</span> (IntToString(port) == name)<a name="l00259"></a>00259 <span class="keywordflow">return</span> port;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -