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