1 /*---------------------------------------------------------------------------* 2 Project: Horizon 3 File: socket_Berkeley.h 4 5 Copyright (C)2010 Nintendo Co., Ltd. All rights reserved. 6 7 These coded instructions, statements, and computer programs contain 8 proprietary information of Nintendo of America Inc. and/or Nintendo 9 Company Ltd., and are protected by Federal copyright law. They may 10 not be disclosed to third parties or copied or duplicated in any form, 11 in whole or in part, without the prior written consent of Nintendo. 12 13 $Rev: 26646 $ 14 *---------------------------------------------------------------------------*/ 15 16 #ifndef NN_SOCKET_SOCKET_BERKLEY_H_ 17 #define NN_SOCKET_SOCKET_BERKLEY_H_ 18 19 #include <nn/socket/socket_Types.h> 20 #include <nn/socket/socket_Const.h> 21 #include <nn/socket/socket_IpcWrapper.h> 22 #include <nn/socket/socket_Result.h> 23 24 /* 25 IPC を介することによって返り値や引数が変わってしまうのを吸収する 26 */ 27 28 namespace nn { 29 namespace socket { 30 /*! 31 @name ソケット 32 33 @{ 34 */ 35 36 /*! 37 @brief 新しいソケット記述子を作成します。 38 39 現在のバージョンでは少なくとも 8 個のソケットを同時に作成することができます。 40 41 @param[in] af @ref PF_INET を指定してください。 42 @param[in] type 作成するソケットの種類を指定します。 43 現時点では @ref SOCK_STREAM と @ref SOCK_DGRAM をサポートしています。 44 45 @param[in] protocol ソケットに用いるプロトコルを指定します。protocol が 0 の場合、 46 指定したプロトコルファミリとタイプに対するデフォルトのプロトコルが使われます。 47 現時点では 0 を指定してください。 48 49 @return 1以上 新しいソケット記述子。 50 @return ENETRESET ソケットライブラリが初期化されていません。 51 @return EAFNOSUPPORT サポートされていないアドレスファミリ。 52 @return EPROTONOSUPPORT サポートされていないプロトコル。 53 @return EMFILE ソケット記述子をこれ以上作れません。 54 @return ENOMEM メモリ不足。 55 @return EPROTOTYPE サポートされていないソケットタイプ。 56 57 @see Close 58 */ Socket(s32 af,s32 type,s32 protocol)59 inline s32 Socket(s32 af, s32 type, s32 protocol) 60 { 61 s32 rval = 0; 62 Result result = detail::Socket(&rval, af, type, protocol); 63 NN_SOCKET_RETURN_IF_FAILED(result); 64 return rval; 65 } 66 67 /*! 68 @brief ストリームソケット ( @ref SOCK_STREAM ) を使って接続要求の受付を開始します。 69 70 @param[in] s ソケット記述子を指定します。@ref Socket によって作成したソケット記述子を指定して下さい。 71 @param[in] backlog ソケットのリッスンバックログキューに保持する未処理の接続の最大数を指定します。 72 backlogが 0 または負の場合、最大数は 1 に設定されます。 73 74 @return 0 処理に成功しました。 75 @return ENETRESET ソケットライブラリが初期化されていません。 76 @return EBADF 不正なソケット記述子。 77 @return EOPNOTSUPP サポートされていない処理。 78 @return EINVAL 無効な処理。 79 @return ENOBUFS リソース不足。 80 81 @see Bind, Accept 82 */ Listen(s32 s,s32 backlog)83 inline s32 Listen(s32 s, s32 backlog) 84 { 85 s32 rval = 0; 86 Result result = detail::Listen(&rval, s, backlog); 87 NN_SOCKET_RETURN_IF_FAILED(result); 88 return rval; 89 } 90 91 /*! 92 @brief 着信を受付けます。 93 94 接続キューから最初の新しいソケットを接続を取り出し、指定したソケットと同じ 95 ソケットタイプ、プロトコル、アドレスファミリーの新しいソケットを作成し、 96 新しいソケット記述子を返します。元のソケットはさらに接続要求を受け付けられる 97 ようにそのまま残ります。 98 99 ソケット記述子が @ref Fcntl によって非封鎖モードに設定されていなければ、 100 Accept は未処理の接続がキューになければブロックします。 101 102 なお、取り出した新しいソケットの代わりにバックログを一つ確保しますが、メモリ不足 103 などでバックログが確保できなかった場合、着信の有無にかかわらず @ref ENOMEM を返します。 104 105 @param[in] s ソケット記述子を指定します。 106 @ref Socket によって作成し、 107 @ref Bindによってアドレスをバインドし、 108 @ref Listen の呼び出しに成功したソケット記述子を指定して下さい。 109 110 @param[out] sockAddr 受け付けた接続相手のソケットアドレスを記録するための 111 ソケットアドレス構造体へのポインタを指定します。 112 113 114 @return 1以上 受け付けた接続のソケット記述子。 115 @return EINVAL 無効な処理。 116 @return ENETRESET ソケットライブラリが初期化されていません。 117 @return EBADF 不正なソケット記述子。 118 @return EOPNOTSUPP サポートされていない処理。 119 @return ENOBUFS リソース不足。 120 @return EAGAIN O_NONBLOCK がソケット記述子に設定されていて、 121 かつ現在受け付けられる接続がありません。 122 @return ECONNABORTED 接続がキャンセルされました。 123 @return ENOMEM メモリ不足 124 125 @see Fcntl, GetPeerName, Listen 126 */ Accept(s32 s,SockAddrIn * sockAddr)127 inline s32 Accept(s32 s, SockAddrIn* sockAddr) 128 { 129 s32 rval = 0; 130 Result result = detail::Accept(&rval, s, reinterpret_cast<u8*>(sockAddr), sizeof(SockAddrIn)); 131 NN_SOCKET_RETURN_IF_FAILED(result); 132 return rval; 133 } 134 135 /*! 136 @brief ソケットにローカルソケットアドレスを割り当てます。 137 138 ローカルソケットアドレスは通信元のアドレスのことです。 139 @ref Socket で作成されたばかりのソケットは、いずれのアドレスにもバインドされません。 140 <br/> 141 既ににバインド済みのソケット記述子を指定すると失敗します。 142 割り当てたローカルソケットアドレスは @GetSockName にて取得できます。 143 144 @param[in] s ソケット記述子を指定します。@ref Socket によって作成したソケット記述子を指定して下さい。 145 @param[in] sockAddr 割り当てるアドレス情報を保持しているソケットアドレス構造体 @ref SockAddrIn へのポインタを指定します。 146 147 @return 0 処理に成功しました。 148 @return ENETRESET ソケットライブラリが初期化されていません。 149 @return EBADF 不正なソケット記述子。 150 @return EOPNOTSUPP サポートされていない処理。 151 @return EINVAL 無効な処理。(ソケットがすでにアドレスにバインド済み、など) 152 @return EAFNOSUPPORT サポートされていないアドレスファミリー。 153 @return EADDRINUSE アドレスがすでに使用中。 154 155 @see Socket, GetSockName 156 */ Bind(s32 s,const SockAddrIn * sockAddr)157 inline s32 Bind(s32 s, const SockAddrIn* sockAddr) 158 { 159 s32 rval = 0; 160 Result result = detail::Bind(&rval, s, reinterpret_cast<const u8*>(sockAddr), sizeof(SockAddrIn)); 161 NN_SOCKET_RETURN_IF_FAILED(result); 162 return rval; 163 } 164 165 /*! 166 @brief 指定したソケット記述子を使用し指定したリモートホストにへ接続を試みます。 167 168 @ref Bind によってソケットにローカルアドレスがバインドされていなかった場合、 169 @ref Connect によってソケットには使われていないローカルアドレスがバインドされます。 170 <br/> 171 ソケットがストリームソケット ( @ref SOCK_STREAM ) の場合には通常は接続が確立するまで 172 ブロックしますが、 @ref Fcntl によって非封鎖モードに設定されている場合には 173 可能な限り早く返ります。 174 この場合 @ref Poll によって接続の確立を調べることができます。 175 接続の確立に失敗した場合、まず Poll の返す値に POLLRDNORM と POLLWRNORM が立ちます。 176 接続の失敗は、続けて呼び出したデータ送信関数またはデータ受信関数がエラーを返すこと 177 で知ることができます。 178 <br/> 179 ソケットがデータグラムソケット ( @ref SOCK_DGRAM ) の場合には、データグラムの 180 送信先ソケットアドレスが変更されるだけですので、 封鎖モードと非封鎖モードでの動作に 181 違いはありません。 182 183 184 @param[in] s ソケット記述子を指定します。@ref Socket によって作成したソケット記述子を指定して下さい。 185 @param[in] sockAddr 通信先のアドレス情報を保持しているソケットアドレス構造体へのポインタを指定します。 186 187 @return 0 処理に成功しました。 188 @return ENETRESET ソケットライブラリが初期化されていません。 189 @return EBADF 不正なソケット記述子。 190 191 @see 192 */ Connect(s32 s,const SockAddrIn * sockAddr)193 inline s32 Connect(s32 s, const SockAddrIn* sockAddr) 194 { 195 s32 rval = 0; 196 Result result = detail::Connect(&rval, s, reinterpret_cast<const u8*>(sockAddr), sizeof(SockAddrIn)); 197 NN_SOCKET_RETURN_IF_FAILED(result); 198 return rval; 199 } 200 201 /*! 202 @brief ソケットを通じてリモートホストからデータ(メッセージ)の受信を試みます。 203 204 通常はソケットがメッセージを受信するまでブロックしますが、@ref Fcntl によって 205 非封鎖モードに設定されている場合、flags に MSG_DONTWAIT を 指定した場合には、 206 関数を呼び出した時点で受信されていたデータのみを取得し、ブロックしません。 207 <br/> 208 データグラムソケット ( @ref SOCK_DGRAM ) では、メッセージ全体が単一処理で読み出されます。 209 メッセージが与えられたバッファに収まらず、flags に @ref MSG_PEEK が 指定されていない場合には、 210 超過した分のデータは破棄されます。 211 <br/> 212 ストリームソケット ( @ref SOCK_STREAM ) では、メッセージ境界は無視されます。 213 この場合、データは利用可能になり次第ユーザーへ返ります。 214 215 @param[in] s ソケット記述子を指定します。@ref Socket もしくは @ref Accept によって作成したソケット記述子を指定して下さい。 216 @param[in] buf 受信データを読み出すバッファへのポインタを指定します。 217 @param[in] len 受信データを読み出すバッファのサイズをバイト単位で指定します。 218 219 @param[in] flags メッセージの伝達種別を指定します。 220 @param[out] sockFrom 通信先のアドレス情報を取得するソケットアドレス構造体へのポインタを指定します。 221 ソケットアドレスの len フィールドは適切に初期化 ( 例: sizeof( @ref SockAddrIn ) ) しておく必要があります。 222 223 @return 0 ストリームソケット ( @ref SOCK_STREAM ) では、リモートホストがメッセージの送信を終了したため 224 これ以上メッセージの受信ができないことを示します。 225 データグラムソケット ( @ref SOCK_DGRAM ) では、0 は返りません。 226 227 1 以上 受信したメッセージのバイト数です。 228 229 @return ENETRESET ソケットライブラリが初期化されていません。 230 @return EBADF 不正なソケット記述子。 231 @return EAGAIN O_NONBLOCK がソケット記述子に設定されていて(もしくは MSG_DONTWAIT が flags 指定されていて)、 232 受信を待つデータもしくは帯域外データがありません。 233 234 @return EINVAL 無効な処理。 235 @return EOPNOTSUPP サポートされていない処理。 236 @return ENOTCONN 接続されていません。 237 @return ECONNRESET 接続がリセットされました。 238 @return EINTR 中止されました。 239 @return ETIMEDOUT 時間切れ。 240 @return ENETDOWN ローカルネットワークインターフェースがダウンしています。 241 242 @see 243 */ RecvFrom(s32 s,void * buf,s32 len,s32 flags,SockAddrIn * sockFrom)244 inline s32 RecvFrom(s32 s, void* buf, s32 len, s32 flags, SockAddrIn* sockFrom) 245 { 246 s32 rval; 247 Result result; 248 if (len <= detail::COPY_OR_MAP_THRESHOLD) 249 { 250 result = detail::RecvFromSmall(&rval, s, reinterpret_cast<u8*>(buf), len, flags, reinterpret_cast<u8*>(sockFrom), sizeof(SockAddrIn)); 251 } 252 else 253 { 254 result = detail::RecvFrom(&rval, s, reinterpret_cast<u8*>(buf), len, flags, reinterpret_cast<u8*>(sockFrom), sizeof(SockAddrIn)); 255 } 256 NN_SOCKET_RETURN_IF_FAILED(result); 257 return rval; 258 } 259 260 /*! 261 @brief ソケットを通じてリモートホストからデータ(メッセージ)の受信を試みます。 262 263 受信対象のホストを指定しない以外は @ref RecvFrom と同じです。 264 詳しくは @ref RecvFrom を参照してください。 265 266 @param[in] s @ref RecvFrom の説明を参照してください。 267 @param[in] buf @ref RecvFrom の説明を参照してください。 268 @param[in] len @ref RecvFrom の説明を参照してください。 269 @param[in] flags @ref RecvFrom の説明を参照してください。 270 271 @see RecvFrom 272 */ Recv(s32 s,void * buf,s32 len,s32 flags)273 inline s32 Recv(s32 s, void* buf, s32 len, s32 flags) 274 { 275 return RecvFrom(s, buf, len, flags, NULL); 276 } 277 278 /*! 279 @brief ソケットを通じてリモートホストからデータ(メッセージ)の受信を試みます。 280 281 受信対象のホストとフラグを指定しない以外は @ref RecvFrom と同じです。 282 詳しくは @ref RecvFrom を参照してください。 283 284 @param[in] s @ref RecvFrom の説明を参照してください。 285 @param[in] buf @ref RecvFrom の説明を参照してください。 286 @param[in] len @ref RecvFrom の説明を参照してください。 287 288 @see RecvFrom 289 */ Read(s32 s,void * buf,s32 len)290 inline s32 Read(s32 s, void* buf, s32 len) 291 { 292 return RecvFrom(s, buf, len, 0, NULL); 293 } 294 295 /*! 296 @brief ソケットを通じてリモートホストへデータ(メッセージ)の送信を試みます。 297 298 通常はソケットの送信バッファにメッセージを格納するだけの空きが生じるまでブロックしますが、 299 @ref Fcntl によって非封鎖モードに設定されている場合、 300 flags に MSG_DONTWAIT を 指定した場合にはブロックしません。 301 <br/> 302 データグラムソケット ( @ref SOCK_DGRAM ) では、メッセージ全体が単一処理で読み出されます。 303 メッセージが与えられたバッファに収まらず、flags に MSG_PEEK が 指定されていない場合には、 304 超過した分のデータは破棄されます。 305 <br/> 306 ストリームソケット ( @ref SOCK_STREAM ) では、メッセージ境界は無視されます。 307 この場合、データは利用可能になり次第ユーザーへ返ります。 308 309 310 @param[in] s ソケット記述子を指定します。@ref Socket もしくは @ref Accept によって作成したソケット記述子を指定して下さい。 311 @param[in] buf 送信データを保持しているバッファへのポインタを指定します。 312 @param[in] len 送信するデータのサイズをバイト単位で指定します。 313 @param[in] flags メッセージの伝達種別を指定します。 314 @param[in] sockTo 通信先のアドレス情報を保持しているソケットアドレス構造体へのポインタを指定します。 315 316 @return 0 処理に成功しました。 317 @return ENETRESET ソケットライブラリが初期化されていません。 318 @return EBADF 不正なソケット記述子。 319 320 @see 321 */ SendTo(s32 s,const void * buf,s32 len,s32 flags,const SockAddrIn * sockTo)322 inline s32 SendTo(s32 s, const void* buf, s32 len, s32 flags, const SockAddrIn* sockTo) 323 { 324 s32 rval; 325 Result result; 326 if (len <= detail::COPY_OR_MAP_THRESHOLD) 327 { 328 result = detail::SendToSmall(&rval, s, 329 reinterpret_cast<const u8*>(buf), len, 330 flags, 331 reinterpret_cast<const u8*>(sockTo), sizeof(SockAddrIn)); 332 } 333 else 334 { 335 result = detail::SendTo(&rval, s, 336 reinterpret_cast<const u8*>(buf), len, 337 flags, 338 reinterpret_cast<const u8*>(sockTo), sizeof(SockAddrIn)); 339 } 340 NN_SOCKET_RETURN_IF_FAILED(result); 341 return rval; 342 } 343 SendToMulti(s32 s,const void * buf,s32 len,s32 flags,const SockAddrIn * sockTo,s32 saCount)344 inline s32 SendToMulti(s32 s, const void* buf, s32 len, s32 flags, const SockAddrIn* sockTo, s32 saCount) 345 { 346 s32 rval; 347 Result result; 348 result = detail::SendToSmallMulti(&rval, s, 349 reinterpret_cast<const u8*>(buf), len, 350 flags, 351 reinterpret_cast<const u8*>(sockTo), sizeof(SockAddrIn), sizeof(SockAddrIn) * saCount); 352 NN_SOCKET_RETURN_IF_FAILED(result); 353 return rval; 354 } 355 /*! 356 @brief ソケットを通じてリモートホストへデータ(メッセージ)の送信を試みます。 357 358 送信対象のホストを指定しない以外は @ref SendTo と同じです。 359 詳しくは @ref SendTo を参照してください。 360 361 @param[in] s @ref SendTo の説明を参照してください。 362 @param[in] buf @ref SendTo の説明を参照してください。 363 @param[in] len @ref SendTo の説明を参照してください。 364 @param[in] flags @ref SendTo の説明を参照してください。 365 366 @see SendTo 367 */ Send(s32 s,const void * buf,s32 len,s32 flags)368 inline s32 Send(s32 s, const void* buf, s32 len, s32 flags) 369 { 370 return SendTo(s, buf, len, flags, NULL); 371 } 372 373 /*! 374 @brief ソケットを通じてリモートホストへデータ(メッセージ)の送信を試みます。 375 376 送信対象のホストとフラグを指定しない以外は @ref SendTo と同じです。 377 詳しくは @ref SendTo を参照してください。 378 379 @param[in] s @ref SendTo の説明を参照してください。 380 @param[in] buf @ref SendTo の説明を参照してください。 381 @param[in] len @ref SendTo の説明を参照してください。 382 @param[in] flags @ref SendTo の説明を参照してください。 383 384 @see SendTo 385 */ Write(s32 s,const void * buf,s32 len)386 inline s32 Write(s32 s, const void* buf, s32 len) 387 { 388 return SendTo(s, buf, len, 0, NULL); 389 } 390 391 /*! 392 @brief ソケットを閉じます。閉じられたソケットは以後使用できなくなります。 393 394 閉じる対象となるソケットを用いた関数呼び出しがブロックされている場合、 395 ブロックは解除され、それぞれ所定のエラーを返します。 396 <br/> 397 @ref Fcntl によって非封鎖モードに設定されていないストリームソケット ( SOCK_STREAM ) を 398 閉じる場合は、 @ref Linger オプション設定に従って接続が閉じられます。 399 <br/> 400 デフォルトでは、Close はブロックせずすぐに処理を返します。 401 そして、バックグランドで残送信データを自動的に転送してからソケットが使用していたリソースを解放します。 402 403 @param[in] s ソケット記述子を指定します。@ref Socket もしくは @ref Accept によって作成したソケット記述子を指定して下さい。 404 405 @return 0 処理に成功しました。 406 @return ENETRESET ソケットライブラリが初期化されていません。 407 @return EBADF 不正なソケット記述子。 408 @return ENOTCONN 接続されていません。 409 @return EINVAL 無効な処理。 410 411 @see Socket, Fcntl, Shutdown 412 */ Close(s32 s)413 inline s32 Close(s32 s) 414 { 415 s32 rval = 0; 416 Result result = detail::Close(&rval, s); 417 NN_SOCKET_RETURN_IF_FAILED(result); 418 return rval; 419 } 420 421 /*! 422 @brief ソケットの送受信処理の一部もしくは全てを遮断します。 423 424 425 @param[in] s ソケット記述子を指定します。@ref Socket もしくは @ref Accept によって作成したソケット記述子を指定して下さい。 426 @param[in] how 遮断方法の種類を指定します。 <br/> 427 - SHUT_RD 以降の受信処理を不可にします。<br/> 428 - SHUT_WR 以降の送信処理を不可にします。<br/> 429 - SHUT_RDWR 以降の送受信処理を不可にします。<br/> 430 @return 0 処理に成功しました。 431 @return ENETRESET ソケットライブラリが初期化されていません。 432 @return EBADF 不正なソケット記述子。 433 @return ENOTCONN 接続されていません。 434 @return EINVAL 無効な処理。 435 @see 436 */ Shutdown(s32 s,s32 how)437 inline s32 Shutdown(s32 s, s32 how) 438 { 439 s32 rval = 0; 440 Result result = detail::Shutdown(&rval, s, how); 441 NN_SOCKET_RETURN_IF_FAILED(result); 442 return rval; 443 } 444 445 /*! 446 @brief ソケットの内部設定値や内部状態情報を取得します。 447 448 @param[in] s ソケット記述子を指定します。@ref Socket もしくは @ref Accept によって作成したソケット記述子を指定して下さい。 449 @param[in] level 対象のプロトコル層 @ref SocketLevel を指定します。 450 @param[in] optname 対象のオプション @ref SocketOptionType を指定します。 451 @param[out] optval 設定の格納先バッファを指定します。 452 @param[in,out] optlen optname に応じた optval のバッファ長を指定します。 453 454 @return 0 処理に成功しました。 455 @return ENETRESET ソケットライブラリが初期化されていません。 456 @return EBADF 不正なソケット記述子。 457 @return EINVAL 無効な処理。 458 @see SetSockOpt 459 */ GetSockOpt(s32 s,s32 level,int optname,void * optval,int * optlen)460 inline s32 GetSockOpt(s32 s, s32 level, int optname, void* optval, int* optlen) 461 { 462 s32 rval = 0; 463 Result result = detail::GetSockOpt(&rval, s, level, optname, reinterpret_cast<u8*>(optval), optlen); 464 NN_SOCKET_RETURN_IF_FAILED(result); 465 return rval; 466 } 467 468 /*! 469 @brief ソケットの内部設定値や内部状態情報を変更します。 470 471 @param[in] s ソケット記述子を指定します。@ref Socket もしくは @ref Accept によって作成したソケット記述子を指定して下さい。 472 @param[in] level 対象のプロトコル層 @ref SocketLevel を指定します。 473 @param[in] optname 対象のオプション @ref SocketOptionType を指定します。 474 @param[out] optval オプション情報を保持しているバッファへのポインタを指定します。 475 @param[in,out] optlen optname に応じた optval のバッファ長を指定します。 476 477 @return 0 処理に成功しました。 478 @return ENETRESET ソケットライブラリが初期化されていません。 479 @return EBADF 不正なソケット記述子。 480 @return EINVAL 無効な処理。 481 @see GetSockOpt 482 */ SetSockOpt(s32 s,s32 level,s32 optname,const void * optval,s32 optlen)483 inline s32 SetSockOpt(s32 s, s32 level, s32 optname, const void* optval, s32 optlen) 484 { 485 s32 rval = 0; 486 Result result = detail::SetSockOpt(&rval, s, level, optname, reinterpret_cast<const u8*>(optval), optlen); 487 NN_SOCKET_RETURN_IF_FAILED(result); 488 return rval; 489 } 490 491 /*! 492 @brief ソケットの動作設定フラグを制御します。 493 494 @param[in] s ソケット記述子を指定します。@ref Socket もしくは @ref Accept によって作成したソケット記述子を指定して下さい。 495 @param[in] cmd 動作設定フラグの制御方法を指定します。<br/> 496 - F_GETFL 497 - 動作設定フラグを読み出します。 <br/> 498 - F_SETFL 499 動作設定フラグを変更します。 <br/> 500 @param[in] val 制御方法により必要な追加の引数を指定します。 501 cmd が F_GETFL の場合は必要な追加引数はありませんので、 502 この引数は無視されます。 503 cmd が F_SETFL の場合は動作設定フラグを指定します。 504 0 もしくは以下の値の論理和です。<br/> 505 - O_NONBLOCK 506 ソケットを非封鎖モードに設定します。 507 このフラグを設定しない場合にはソケットは封鎖モードになります。 なお、デフォルトではソケットは作成された時に封鎖モードに設定されます。 508 509 @return 0 処理に成功しました。 510 @return ENETRESET ソケットライブラリが初期化されていません。 511 @return EBADF 不正なソケット記述子。 512 513 @see Accept, Connect, Recv, Send 514 */ Fcntl(s32 s,s32 cmd,s32 val)515 inline s32 Fcntl( s32 s, s32 cmd, s32 val ) 516 { 517 s32 rval = 0; 518 Result result = detail::Fcntl(&rval, s, cmd, val); 519 NN_SOCKET_RETURN_IF_FAILED(result); 520 return rval; 521 } 522 523 /*! 524 @brief 複数のソケット記述子を指定し、その中に読み出しや書き込みが可能な状態のソケットがあるかを一度に調べます。 525 526 ソケットの状態変化を監視し、通常は指定した条件のソケットが見つかるまでブロックします。 527 指定した条件のソケットが見つからないままタイムアウト時間が過ぎた場合、 @ref Shutdown や @ref Close を使って 528 ソケットの送受信処理を遮断する場合、ソケットになんらかの異常が検知された場合などにも 529 ブロックが解除されます。 530 531 @param[in] fds 調査の対象となるソケット及び調査条件を指定し、調査結果を取得する @ref PollFd の配列を指定します。 532 @param[in] nfds fds で指定する配列の要素数を指定します。 533 @param[in] timeout ソケットが見つからない状態が続いた時のタイムアウト時間をミリ秒単位で指定します。 534 0 以上の値、もしくは以下の定数を指定して下さい。 535 <br/> 536 - INFTIM タイムアウトしません。<br/> 537 538 @return 正の数 読み込みあるいは書き込み可能になったソケット記述子の数。 539 @return 0 呼び出しがタイムアウトしました。 540 @return ENETRESET ソケットライブラリが初期化されていません。 541 @return EBADF 不正なソケット記述子。 542 @return EINVAL 無効な処理。 543 544 @see 545 */ Poll(PollFd fds[],u32 nfds,s32 timeout)546 inline s32 Poll( PollFd fds[], u32 nfds, s32 timeout ) 547 { 548 s32 rval = 0; 549 Result result = detail::Poll(&rval, fds, nfds, timeout); 550 NN_SOCKET_RETURN_IF_FAILED(result); 551 return rval; 552 } 553 554 /*! 555 @brief 指定したソケットに帯域外データマークにあるかどうかを調べます。 556 557 ソケットの読み出し可能なバッファの先頭が TCP の緊急データの最後の 1 バイトかどうかを調べるために使用することができます。 558 559 @param[in] s ソケット記述子を指定します。@ref Socket もしくは @ref Accept によって作成したソケット記述子を指定して下さい。 560 561 @return 1 ソケットに帯域外のデータを受信したマークがされています。 562 当関数呼び出しに続けて MSG_OOB を指定した @ref Recv を呼び出すことで 563 帯域外のデータを読み出すことができます。 564 プロトコルが TCP の場合には、緊急データの最後の 1 バイトが 565 読み出し可能なバッファの先頭に存在することを示します。 566 567 @return 0 ソケットには帯域外のデータを受信したマークがされていません。 568 プロトコルが TCP の場合には、緊急データの存在は読み出し可能なバッファの先頭が 569 TCP の緊急データの最後の 1 バイトになるまで検出できない点に注意して下さい。 570 571 @return ENETRESET ソケットライブラリが初期化されていません。 572 @return EBADF 不正なソケット記述子。 573 @return EINVAL 無効な処理。 574 575 @see Recv, RecvFrom 576 */ SockAtMark(s32 s)577 inline s32 SockAtMark( s32 s ) 578 { 579 s32 rval = 0; 580 Result result = detail::SockAtMark(&rval, s); 581 NN_SOCKET_RETURN_IF_FAILED(result); 582 return rval; 583 } 584 585 /*! 586 @brief 自ホストのプライマリ IPv4 アドレスを取得します。 587 588 @return 0 通信が利用可能な状態ではありません。(自ホストに IPv4 アドレスが割り当てられていません。) 589 @return 0 以外 ホストのプライマリ IPv4 アドレスをネットワークバイトオーダーの 32 ビット数値で返します。 590 @see 591 */ GetHostId(void)592 inline u32 GetHostId( void ) 593 { 594 u32 rval = 0; 595 detail::GetHostId(&rval); 596 return rval; 597 } 598 599 /*! 600 @brief ソケットのローカルアドレスを取得します。 601 602 ローカルアドレスは通信元のアドレスとして使用されます。 603 ローカルアドレスは @ref Bind, @ref Connect を呼び出すと確定します。 604 ローカルアドレスが確定されていない場合、TCP ソケットではエラーになります。 605 UDP ソケットでは、デフォルト値の 0.0.0.0 が取得できます。 606 607 @param[in] s ソケット記述子を指定します。@ref Socket もしくは @ref Accept によって作成したソケット記述子を指定して下さい。 608 @param[in] sockAddr バインドされたアドレス情報を取得するソケットアドレス構造体へのポインタを指定します。 609 610 @return 0 処理に成功しました。 611 @return ENETRESET ソケットライブラリが初期化されていません。 612 @return EBADF 不正なソケット記述子。 613 @return EINVAL 無効な処理。 614 615 @see GetPeerName 616 */ GetSockName(s32 s,SockAddrIn * sockAddr)617 inline s32 GetSockName( s32 s, SockAddrIn* sockAddr ) 618 { 619 s32 rval = 0; 620 Result result = detail::GetSockName(&rval, s, reinterpret_cast<u8*>(sockAddr), sizeof(SockAddrIn)); 621 NN_SOCKET_RETURN_IF_FAILED(result); 622 return rval; 623 } 624 625 /*! 626 @brief ソケットのリモートアドレスを取得します。 627 628 リモートアドレスはソケットの通信先となるアドレスです。 629 630 @param[in] s ソケット記述子を指定します。@ref Socket もしくは @ref Accept によって作成したソケット記述子を指定して下さい。 631 @param[in] sockAddr 通信先のアドレス情報を取得するソケットアドレス構造体へのポインタを指定します。 632 633 @return 0 処理に成功しました。 634 @return ENETRESET ソケットライブラリが初期化されていません。 635 @return EBADF 不正なソケット記述子。 636 @return ENOTCONN 接続されていないか、前もって指定した相手がありませんでした。 637 638 @see GetSockName 639 */ GetPeerName(s32 s,SockAddrIn * sockAddr)640 inline s32 GetPeerName( s32 s, SockAddrIn* sockAddr ) 641 { 642 s32 rval = 0; 643 Result result = detail::GetPeerName(&rval, s, reinterpret_cast<u8*>(sockAddr), sizeof(SockAddrIn)); 644 NN_SOCKET_RETURN_IF_FAILED(result); 645 return rval; 646 } 647 GetNetworkOpt(s32 level,s32 optname,void * optval,s32 * optlen)648 inline s32 GetNetworkOpt( s32 level, s32 optname, void* optval, s32* optlen ) 649 { 650 s32 rval = 0; 651 Result result = detail::GetNetworkOpt(&rval, level, optname, reinterpret_cast<u8*>(optval), optlen); 652 NN_SOCKET_RETURN_IF_FAILED(result); 653 return rval; 654 } 655 GetResolverInfo(nn::socket::DnsServerInfo * pDnsServerInfo)656 inline s32 GetResolverInfo( nn::socket::DnsServerInfo* pDnsServerInfo ) 657 { 658 s32 rval = 0; 659 Result result = detail::GetResolverInfo(&rval, pDnsServerInfo); 660 NN_SOCKET_RETURN_IF_FAILED(result); 661 return rval; 662 } 663 664 // DnsUserClient 665 /*! 666 @brief ホストの名前を元に、ホストの情報を検索します。 667 668 DNS サーバに問い合わせを行う可能性があり、検索が完了するまでブロックします。 669 GetHostByName 関数は再入可能でもスレッドセーフでもありません。 670 複数のスレッドから呼び出す場合は @ref GetAddrInfo を使用して下さい。 671 672 @param[in] name ホスト名文字列、もしくはドット十進記法で IPv4 ホストアドレスを表現した 673 文字列へのポインタを指定します。 文字列は NULL で終端されている必要があります。 674 675 @return 処理に成功した場合は、ホストの情報を格納した @ref HostEnt 構造体へのポインタを返します。 676 構造体の実体はライブラリの内部バッファです。 677 678 処理に失敗した場合には NULL を返します。 679 680 @see GetHostByAddr, GetAddrInfo 681 */ 682 HostEnt* GetHostByName(const char8* name); 683 684 /*! 685 @brief ホストのアドレスを元に、ホストの情報を検索します。 686 687 DNS サーバに問い合わせを行う可能性があり、検索が完了するまでブロックします。 688 689 @param[in] addr len バイトの数値形式のホストアドレスを保持しているバッファへのポインタを指定します。 690 @param[in] len 数値形式のホストアドレスの長さ ( バイト単位 ) を指定します。 691 AF_INET では IP_ALEN を指定して下さい。 692 @param[in] type ホストアドレスのアドレスファミリーを指定します。 693 @ref AF_INET 694 695 @return 処理に成功した場合は、ホストの情報を格納した @ref HostEnt 構造体へのポインタを返します。 696 構造体の実体はライブラリの内部バッファです。 697 698 処理に失敗した場合には NULL を返します。 699 @see GetHostByName, GetNameInfo 700 */ 701 HostEnt* GetHostByAddr(const void* addr, s32 len, s32 type); 702 703 /*! 704 @brief ホストのホスト名及びサービス名を元に、ホストの情報を検索します。 705 706 DNS サーバに問い合わせを行う可能性があり、検索が完了するまでブロックします。 707 <br/> 708 検索結果を保持するバッファは、@ref Initialize で指定したワーク領域から新たに確保されます。 709 検索結果を解放するには @ref FreeAddrInfo を使用します。 710 711 @param[in] nodeName ホスト名文字列、もしくはドット十進記法で IPv4 ホストアドレスを表現した文字列へのポインタを指定します。 712 文字列は NULL で終端されている必要があります。 713 @param[in] servName サービス名文字列、もしくはポート番号を数値記法で表現した文字列へのポインタを指定します。 714 文字列は NULL で終端されている必要があります。 715 @param[in] hints 検索時の動作設定を行う @ref AddrInfo 構造体へのポインタを指定します。 716 @param[in] res 検索結果を格納される @ref AddrInfo へのポインタが格納される変数へのポインタを指定します。 717 718 @return 0 処理に成功しました。 719 @return EAI_FAIL 以下のいずれかの理由で処理できません。 720 - hints に指定したソケットの種類がサポートされていません。 721 - hints に指定したソケットのプロトコルがサポートされていません。 722 - hints に @ref AI_NUMERICHOST が指定されているにも関わらず nodeName をドット十進記法の文字列として解釈できません。 723 - hints に @ref AI_NUMERICSERV が指定されているにも関わらず servName を数値記法の文字列として解釈できません。 724 - nodeName に指定したホスト名の長さが @ref MAXDNAME を越えています。 725 - servName に指定したサービス名が既知のサービス名として解釈できません。 726 727 @return EAI_MEMORY 処理に必要なメモリを確保できません。 728 @return EAI_NONAME 検索対象のホストが見つかりません。 729 730 @see FreeAddrInfo 731 */ 732 s32 GetAddrInfo(const char8* nodeName, const char8* servName, const AddrInfo* hints, AddrInfo** res); 733 734 /*! 735 @brief @ref GetAddrInfo を使用してホスト情報を検索した際に 736 検索結果を保持するために確保されたバッファを解放します。 737 738 @param[in] head @ref GetAddrInfo によって得たホスト情報のリスト @ref AddrInfo の先頭への 739 ポインタを指定します。 740 NULL ポインタを指定した場合は FreeAddrInfo 関数は何も処理を行いません。 741 742 @see GetAddrInfo 743 */ 744 void FreeAddrInfo(AddrInfo* head); 745 746 /*! 747 @brief ホストのアドレス情報を元に、ホスト名及びサービス名を検索します。 748 749 DNS サーバに問い合わせを行う可能性があり、検索が完了するまでブロックします。 750 751 @param[in] sa 検索するホストのアドレス情報を保持しているソケットアドレス構造体へのポインタを指定します。 752 @param[in] node ホスト名を取得するバッファへのポインタを指定します。 753 @param[in] nodeLen ホスト名を取得するバッファの大きさをバイト単位で指定します。 754 @param[in] service サービス名を取得するバッファへのポインタを指定します。 755 @param[in] serviceLen サービス名を取得するバッファの大きさをバイト単位で指定します。 756 @param[in] flags 検索時の動作設定フラグを指定します。0 もしくは以下の値の論理和です。 757 - NI_NOFQDN 758 - 完全修飾ドメイン名 ( FQDN ) のうちノード名の部分だけをホスト名として取得します。 759 - NI_NUMERICHOST 760 - ホスト名はソケットアドレス構造体に含まれているホストアドレスをドット十進記法による文字列に変換して取得します。 761 - NI_NAMEREQD 762 - 検索対象のホストが見つからない場合に、数値形式のホストアドレスを文字列に変換することで代替せずにエラー ( SO_EAI_NONAME ) として扱います。 763 - NI_NUMERICSERV 764 -サービス名はソケットアドレス構造体に含まれているサービス ( ポート番号 ) を数値記法による文字列に変換して取得します。 765 766 @return 0 処理に成功しました。 767 @return EAI_FAMILY sockAddr に指定したソケットアドレスに含まれるプロトコルファミリーがサポートされていません。 768 @return EAI_NONAME nodeLen 及び serviceLen に指定したバッファの大きさが不正であるか、 flags に NI_NAMEREQD を指定した呼び出しで検索対象のホストが見つかりません。 769 770 @see GetAddrInfo, GetHostByAddr 771 */ 772 s32 GetNameInfo(const void* sa, char8* node, s32 nodeLen, char8* service, s32 serviceLen, s32 flags); 773 774 /*! 775 @} 776 777 @name バイトオーダ・アドレス変換 778 @{ 779 */ 780 781 // InetUtils 782 /*! 783 @brief ドット十進記法の IPv4 ホストアドレスを数値形式に変換します。 784 785 @ref Initialize を呼び出していなくても使用することができます。 786 787 @param[in] cp ドット十進記法で IPv4 アドレスを表現した文字列へのポインタを指定します。 788 文字列は NUL で終端されている必要があります。 789 @param[in] inp 数値形式のアドレスを取得する @ref InAddr へのポインタを指定します。 790 791 @return 1 処理に成功しました。 792 @return 0 cp に指定した文字列がドット十進記法で解釈できません。 793 794 @see InetNtoA, InetPtoN 795 */ 796 s32 InetAtoN(const char* cp, InAddr* inp); 797 798 /*! 799 @brief 数値形式の IPv4 ホストアドレスをドット十進記法の文字列に変換します。 800 801 @ref Initialize を呼び出していなくても使用することができます。 802 <br/> 803 InetNtoA は再入可能でもスレッドセーフでもありません。 804 複数のスレッドから呼び出す場合は @ref InetNtoP を使用して下さい。 805 806 @param[in] in 数値形式の IPv4 ホストアドレスを保持する @ref InAddr を指定します 807 808 @return 変換結果の文字列へのポインタを返します。 809 文字列の実体は静的に割り当てられたライブラリ内部のバッファです。 810 811 @see InetAtoN, InetNtoP 812 */ 813 char* InetNtoA(InAddr in); 814 815 /*! 816 @brief スタンダードテキスト表記のホストアドレスを数値形式に変換します。 817 818 @ref Initialize を呼び出していなくても使用することができます。 819 820 @param[in] af 変換するホストアドレスのアドレスファミリーを指定します。 821 @param[in] src スタンダードテキスト表記でホストアドレスを表現した文字列へのポインタを指定します。 822 文字列は NUL で終端されている必要があります。 823 - AF_INET 824 825 @param[in] dst 数値形式のアドレスを取得する構造体へのポインタを指定します。 826 @ref AF_INET では、@ref InAddr へのポインタを指定して下さい。 827 828 @return 1 処理に成功しました。 829 @return 0 src に指定した文字列がスタンダードテキスト表記で解釈できません。 830 @return EAFNOSUPPORT サポートされていないアドレスファミリーです。 831 832 @see InetNtoP 833 */ 834 s32 InetPtoN(int af, const char* src, void* dst); 835 836 /*! 837 @brief 数値形式のホストアドレスをスタンダードテキスト表記の文字列に変換します。 838 839 @ref Initialize を呼び出していなくても使用することができます。 840 841 @param[in] af 変換するホストアドレスのアドレスファミリーを指定します。 842 - AF_INET 843 844 @param[in] src 数値形式のホストアドレスを保持する構造体へのポインタを指定します。 845 @ref AF_INET では、@ref InAddr へのポインタを指定して下さい。 846 847 848 @param[in] dst スタンダードテキスト表記の文字列を取得するバッファへのポインタを指定します。 849 @ref AF_INET では、スタンダードテキスト表記はドット十進記法となります。 850 851 @param[in] len dst に指定するバッファの大きさをバイト単位で指定します。 852 AF_INET では、ドット十進記法の IPv4 ホストアドレス文字列の最大長 ( INET_ADDRSTRLEN ) のバッファを用意して下さい。 853 854 @return 処理に成功した場合は、変換結果の文字列へのポインタを返します。 855 文字列の実体は dst に指定したバッファです。 856 処理に失敗した場合には NULL を返します。 857 858 @see 859 */ 860 const char* InetNtoP(int af, const void* src, char* dst, unsigned len); 861 862 // byteorder 863 /*! 864 @brief 32 ビットのホストバイトオーダーの値をネットワークバイトオーダーの値に変換します。 865 866 867 @param[in] v 32 ビットのホストバイトオーダーの値を指定します。 868 869 @return 32 ビットのネットワークバイトオーダーの値を返します。 870 871 @see NtoHl, HtoNs 872 */ HtoNl(bit32 v)873 inline bit32 HtoNl(bit32 v) 874 { 875 return NN_SOCKET_HtoNl(v); 876 } 877 878 /*! 879 @brief 32 ビットのネットワークバイトオーダーの値をホストバイトオーダーの値に変換します。 880 881 @param[in] v 32 ビットのネットワークバイトオーダーの値を指定します。 882 883 @return 32 ビットのホストバイトオーダーの値を返します。 884 885 @see HtoNl, NtoHs 886 */ NtoHl(bit32 v)887 inline bit32 NtoHl(bit32 v) 888 { 889 return NN_SOCKET_NtoHl(v); 890 } 891 /*! 892 @brief 16 ビットのホストバイトオーダーの値をネットワークバイトオーダーの値に変換します。 893 894 @param[in] v 16 ビットのホストバイトオーダーの値を指定します。 895 896 @return 16 ビットのネットワークバイトオーダーの値を返します。 897 898 @see NtoHs, HtoNl 899 */ HtoNs(bit16 v)900 inline bit16 HtoNs(bit16 v) 901 { 902 return NN_SOCKET_HtoNs(v); 903 } 904 /*! 905 @brief 16 ビットのネットワークバイトオーダーの値をホストバイトオーダーの値に変換します。 906 907 @param[in] v 16 ビットのネットワークバイトオーダーの値を指定します。 908 909 @return 16 ビットのホストバイトオーダーの値を返します。 910 911 @see HtoNs, NtoHl 912 */ NtoHs(bit16 v)913 inline bit16 NtoHs(bit16 v) 914 { 915 return NN_SOCKET_NtoHs(v); 916 } 917 } 918 } 919 920 #endif // ifndef NN_SOCKET_SOCKET_BERKLEY_H_ 921