可能な場合にはNAT通過を適用した、クライアント間での接続の確立とデータ通信のためのネットワーク関数。
注:このAPIは使用されていないため、今後のSteamworks SDKリリースから削除される可能性があります。
代わりに、
ISteamNetworkingSocketsまたは
ISteamNetworkingMessagesを使ってください。 詳細情報については
Steamネットワーキングを参照してください。
メンバ関数
ISteamNetworking
のメンバー関数は、グローバルのアクセサ関数
SteamNetworking()
経由で呼び出されます。
AcceptP2PSessionWithUser
bool AcceptP2PSessionWithUser( CSteamID steamIDRemote );
名前 | 型 | 説明 |
steamIDRemote | CSteamID | こちらに最初のパケットを送信したユーザーのSteamID。 |
これによりゲームは、着信パケットの受け入れを指定できます。 This needs to be called before a real connection is established to a remote host, the game will get a chance to say whether or not the remote user is allowed to talk to them.
When a remote user that you haven't sent a packet to recently, tries to first send you a packet, your game will receive a callback
P2PSessionRequest_t. This callback contains the Steam ID of the user who wants to send you a packet. In response to this callback, you'll want to see if it's someone you want to talk to (for example, if they're in a lobby with you), and if so, accept the connection; otherwise if you don't want to talk to the user, just ignore the request. If the user continues to send you packets, another
P2PSessionRequest_t will be posted periodically. If you've called
SendP2PPacket on the other user, this implicitly accepts the session request.
この呼び出しは、
P2PSessionRequest_tコールバックへの応答としてのみ行うべき点に注意してください。
戻り値: bool
true は成功時で、
steamIDRemote
が無効の場合のみ
falseとなります。
AllowP2PPacketRelay
bool AllowP2PPacketRelay( bool bAllow );
直接接続またはNATトラバーサルを確立できない場合、P2P接続がSteamサーバーを介したリレーにフォールバックすることを許可または禁止します。
これは、この値を設定した後に作成された接続、またはこの値を設定した後に自動的に再接続する必要がある既存の接続にのみ適用されます。
デフォルトでは、P2Pパケットリレーは許可されています。
戻り値: bool
この関数は常に
trueを返します。
CloseP2PChannelWithUser
bool CloseP2PChannelWithUser( CSteamID steamIDRemote, int nChannel );
名前 | 型 | 説明 |
steamIDRemote | CSteamID | 接続を閉じるユーザーのSteam ID。 |
nChannel | int | 閉じるチャンネル。 |
指定のチャンネルでユーザーとの会話が終了したら、P2Pチャンネルを閉じます。
ユーザーへのチャンネルがすべて閉じられると、そのユーザーへの開いたセッションが閉じられ、このユーザーからの新しいデータが、新しい
P2PSessionRequest_tコールバックをトリガーします。
戻り値: bool
true はチャンネルが正常に閉じられた場合。アクティブなセッションやユーザーとのチャンネルがなかった場合は
false。
CloseP2PSessionWithUser
bool CloseP2PSessionWithUser( CSteamID steamIDRemote );
名前 | 型 | 説明 |
steamIDRemote | CSteamID | 接続を閉じるユーザーのSteam ID。 |
これは内部の接続に割り当てられたすべてのリソースを解放するため、ユーザーとの通信が完了した時に呼び出す必要があります。
リモートユーザーがもう一度データの送信を試みた場合、新しい
P2PSessionRequest_tコールバックがポストされます。
戻り値: bool
true はセッションが正常に閉じられた場合。
steamIDRemote
との接続が開かれていなかった場合には
false。
CreateConnectionSocket
SNetSocket_t CreateConnectionSocket( uint32 nIP, uint16 nPort, int nTimeoutSec );
ソケットを作成し、リモート先への接続を開始します。
これは、Berkley TCPソケットモデルを中心に設計された古い関数セットの一部です。 これら古い関数は将来的に削除されるため、より堅牢なP2P関数の使用を推奨します。
戻り値: SNetSocket_tCreateListenSocket
SNetListenSocket_t CreateListenSocket( int nVirtualP2PPort, uint32 nIP, uint16 nPort, bool bAllowUseOfPacketRelay );
名前 | 型 | 説明 |
nVirtualP2PPort | int | |
nIP | uint32 | |
nPort | uint16 | |
bAllowUseOfPacketRelay | bool | |
ソケットを作成し、他の接続をリッスンします。
別のクライアントの接続時に、
SocketStatusCallback_tコールバックをトリガーします。
複数のポートがある場合、nVirtualP2PPortはクライアントが接続するユニークなIDです。
複数の接続が必要でなければ、通常は0で問題ありません。
unIPは、デフォルトのローカルIPが必要な場合に
0を渡すためにバインドするローカルのIPアドレスです
unPortは、ユーザーが常にピアツーピア接続することを期待し、IP/Port経由で接続できないようにしたい場合に
0を渡すためのポートです。
これは、Berkley TCPソケットモデルを中心に設計された古い関数セットの一部です。 これら古い関数は将来的に削除されるため、より堅牢なP2P関数の使用を推奨します。
戻り値: SNetListenSocket_tCreateP2PConnectionSocket
SNetSocket_t CreateP2PConnectionSocket( CSteamID steamIDTarget, int nVirtualPort, int nTimeoutSec, bool bAllowUseOfPacketRelay );
名前 | 型 | 説明 |
steamIDTarget | CSteamID | |
nVirtualPort | int | |
nTimeoutSec | int | |
bAllowUseOfPacketRelay | bool | |
ソケットを作成し、リモート先への接続を開始します。
既知のSteam ID (クライアントまたはゲームさーバー)経由、またはIPに直接接続できます
成功時にSocketStatusCallback_t callbackをトリガーします
失敗またはタイムアウトすると、m_eSNetSocketStateの失敗コードと共にSocketStatusCallback_tコールバックをトリガーします。
これは、Berkeley TCPソケットモデルを中心に設計された古い関数セットの一部です。これらの古い関数は将来的に削除されるため、より堅牢なP2P関数の使用を推奨します。
戻り値: SNetSocket_tDestroyListenSocket
bool DestroyListenSocket( SNetListenSocket_t hSocket, bool bNotifyRemoteEnd );
リッスンソケットの破棄により、そこからされた生成された通常のソケットすべてが自動的に強制終了となります。
これは、Berkley TCPソケットモデルを中心に設計された古い関数セットの一部です。 これら古い関数は将来的に削除されるため、より堅牢なP2P関数の使用を推奨します。
戻り値: bool
DestroySocket
bool DestroySocket( SNetSocket_t hSocket, bool bNotifyRemoteEnd );
ソケットへの接続を切断し、ハンドルがあれば、無効にします。
ソケット上の未読データはすべて廃棄されます。
bNotifyRemoteEndが設定されている場合、リモートエンドが切断を確認するまで、ソケットは完全に破壊されません。
これは、Berkeley TCPソケットモデルを中心に設計された古い関数セットの一部です。これらの古い関数は将来的に削除されるため、より堅牢なP2P関数の使用を推奨します。
戻り値: bool
GetListenSocketInfo
bool GetListenSocketInfo( SNetListenSocket_t hListenSocket, uint32 *pnIP, uint16 *pnPort );
リッスンソケットがバウンドされているローカルポートを返します。
ソケットがP2P接続のみをリッスンするよう設定されてている場合、*pnIPと*pnPortは0です。
これは、Berkley TCPソケットモデルを中心に設計された古い関数セットの一部です。 これら古い関数は将来的に削除されるため、より堅牢なP2P関数の使用を推奨します。
戻り値: bool
GetMaxPacketSize
int GetMaxPacketSize( SNetSocket_t hSocket );
バイト単位でパケットサイズの最大値を取得します。
これは、Berkeley TCPソケットモデルを中心に設計された古い関数セットの一部です。これらの古い関数は将来的に削除されるため、より堅牢なP2P関数の使用を推奨します。
戻り値: int
GetP2PSessionState
bool GetP2PSessionState( CSteamID steamIDRemote, P2PSessionState_t *pConnectionState );
P2PSessionState_t構造体に、アクティブな接続があるかなど、接続にキューしているバイト数、最後のエラーコード、リレーサーバーが使用されているかどうか、分かる場合はリモートユーz-あのIPとポートなど、接続に関する詳細を入力します。
デバッグ目的でのみ必要な情報です。
戻り値: bool
true は
pConnectionState
が入力された場合。指定のユーザーとオープンなセッションが無い場合は
false。
例:P2PSessionState_t p2pSessionState;
SteamNetworking()->GetP2PSessionState( steamIDremote, &p2pSessionState );
GetSocketConnectionType
ESNetSocketConnectionType GetSocketConnectionType( SNetSocket_t hSocket );
Trueを返し、ソケットが最終的にどのように接続したかを説明します。
これは、Berkley TCPソケットモデルを中心に設計された古い関数セットの一部です。 これら古い関数は将来的に削除されるため、より堅牢なP2P関数の使用を推奨します。
戻り値: ESNetSocketConnectionTypeGetSocketInfo
bool GetSocketInfo( SNetSocket_t hSocket, CSteamID *pSteamIDRemote, int *peSocketStatus, uint32 *punIPRemote, uint16 *punPortRemote );
ポインターのコンテンツを入力し、指定したソケットについての情報を返します。
これは、Berkeley TCPソケットモデルを中心に設計された古い関数セットの一部です。これらの古い関数は将来的に削除されるため、より堅牢なP2P関数の使用を推奨します。
戻り値: bool
IsDataAvailable
bool IsDataAvailable( SNetListenSocket_t hListenSocket, uint32 *pcubMsgSize, SNetSocket_t *phSocket );
Checks for data from any socket that has been connected off this listen socket.
returns false if there is no data remaining
fills out *pcubMsgSize with the size of the next message, in bytes
fills out *phSocket with the socket that data is available on
これは、Berkley TCPソケットモデルを中心に設計された古い関数セットの一部です。 これら古い関数は将来的に削除されるため、より堅牢なP2P関数の使用を推奨します。
戻り値: bool
IsDataAvailableOnSocket
bool IsDataAvailableOnSocket( SNetSocket_t hSocket, uint32 *pcubMsgSize );
Returns false if there is no data remaining.
fills out *pcubMsgSize with the size of the next message, in bytes
これは、Berkeley TCPソケットモデルを中心に設計された古い関数セットの一部です。これらの古い関数は将来的に削除されるため、より堅牢なP2P関数の使用を推奨します。
戻り値: bool
IsP2PPacketAvailable
bool IsP2PPacketAvailable( uint32 *pcubMsgSize, int nChannel = 0 );
名前 | 型 | 説明 |
pcubMsgSize | uint32 * | パケットのサイズを返します。 |
nChannel | int | パッケージが利用可能かを確認するチャンネル。 |
Checks if a P2P packet is available to read, and gets the size of the message if there is one.
This should be called in a loop for each channel that you use. If there is a packet available you should call
ReadP2PPacket to get the packet data.
戻り値: bool
true if there is a packet available; otherwise,
false.
ReadP2PPacket
bool ReadP2PPacket( void *pubDest, uint32 cubDest, uint32 *pcubMsgSize, CSteamID *psteamIDRemote, int nChannel = 0 );
名前 | 型 | 説明 |
pubDest | void * | このバッファにコピーして、パケットデータを返します。 |
cubDest | uint32 | pubDest に割り当てられたサイズ。 これはIsP2PPacketAvailableで返されたものと同じか、最大パケットのサイズとなります。 |
pcubMsgSize | uint32 * | パケットのサイズを返します。 |
psteamIDRemote | CSteamID * | このパケットを送信したユーザーのSteam IDを返します。 |
nChannel | int | パケットが送信されたチャンネル。 |
Reads in a packet that has been sent from another user via
SendP2PPacket.
If the
cubDest
buffer is too small for the packet, then the message will be truncated.
This call is not blocking, and will return false if no data is available.
Before calling this you should have called
IsP2PPacketAvailable.
戻り値: bool
true if a packet was successfully read; otherwise,
false if no packet was available.
例:uint32 msgSize = 0;
while ( SteamNetworking()->IsP2PPacketAvailable( &msgSize ) )
{
void *packet = malloc( msgSize );
CSteamID steamIDRemote;
uint32 bytesRead = 0;
if ( SteamNetworking()->ReadP2PPacket( packet, msgSize, &bytesRead, &steamIDRemote ) )
{
// メッセージディスパッチコードはここ
}
free( packet );
}
RetrieveData
bool RetrieveData( SNetListenSocket_t hListenSocket, void *pubDest, uint32 cubDest, uint32 *pcubMsgSize, SNetSocket_t *phSocket );
Retrieves data from any socket that has been connected off this listen socket.
fills in pubDest with the contents of the message
messages are always complete, of the same size as was sent (i.e. packetized, not streaming)
if *pcubMsgSize < cubDest, only partial data is written
returns false if no data is available
fills out *phSocket with the socket that data is available on
これは、Berkley TCPソケットモデルを中心に設計された古い関数セットの一部です。 これら古い関数は将来的に削除されるため、より堅牢なP2P関数の使用を推奨します。
戻り値: bool
RetrieveDataFromSocket
bool RetrieveDataFromSocket( SNetSocket_t hSocket, void *pubDest, uint32 cubDest, uint32 *pcubMsgSize );
Fills in pubDest with the contents of the message.
messages are always complete, of the same size as was sent (i.e. packetized, not streaming)
if *pcubMsgSize < cubDest, only partial data is written
returns false if no data is available
これは、Berkeley TCPソケットモデルを中心に設計された古い関数セットの一部です。これらの古い関数は将来的に削除されるため、より堅牢なP2P関数の使用を推奨します。
戻り値: bool
SendDataOnSocket
bool SendDataOnSocket( SNetSocket_t hSocket, void *pubData, uint32 cubData, bool bReliable );
sending data
must be a handle to a connected socket
data is all sent via UDP, and thus send sizes are limited to 1200 bytes; after this, many routers will start dropping packets
use the reliable flag with caution; although the resend rate is pretty aggressive,
it can still cause stalls in receiving data (like TCP)
戻り値: bool
SendP2PPacket
bool SendP2PPacket( CSteamID steamIDRemote, const void *pubData, uint32 cubData, EP2PSend eP2PSendType, int nChannel = 0 );
名前 | 型 | 説明 |
steamIDRemote | CSteamID | パケットを送信するターゲットユーザー。 |
pubData | const void * | 送信するパケットデータの未加工のバイト配列。 このパケットの最大サイズは eP2PSendType によって定義されます。 |
cubData | uint32 | バイト単位でのpubData のサイズ。 |
eP2PSendType | EP2PSend | 信頼性、非信頼性、バッファリングなど、希望するデータの送信方法を指定します。 |
nChannel | int | このパケットを送信する仮想ポートとして機能し、別のシステムへのメッセージのルーティングを助けるチャンネル 反対側のデータを取得するためには、同じチャンネル番号で反対側のReadP2PPacket を呼び出す必要があります。 同じユーザーと異なるチャンネルを使用して通信する場合にも、基礎となる同じP2P接続が使用され、リソースが節約されます。 プライマリチャンネル用、またはこの機能を使用しない場合には0を使用します。 |
指定したユーザーにP2Pパケットを送信します。
This is a session-less API which automatically establishes NAT-traversing or Steam relay server connections.
注: The first packet send may be delayed as the NAT-traversal code runs.
See
EP2PSend for descriptions of the different ways of sending packets.
The type of data you send is arbitrary, you can use an off the shelf system like
Protocol Buffers or
Cap'n Proto to encode your packets in an efficient way, or you can create your own messaging system.
戻り値: bool
Triggers a
P2PSessionRequest_t callback.
true if the packet was successfully sent.
Note that this does not mean successfully received, if we can't get through to the user after a timeout of 20 seconds, then an error will be posted via the
P2PSessionConnectFail_t callback.
false upon the following conditions:
- パケットが送信タイプに対して大きすぎる。
- ターゲットのSteam IDが無効である。
- キューに入れられたバイト数が大きすぎるために送信できない。
コールバック
以下は
SteamAPI_RunCallbacksを呼び出すことによって実行されるコールバックです。 これらの多くは
ISteamNetworking
のメンバー関数への応答として直接実行されます。
P2PSessionConnectFail_t
パケットが指定したユーザーに到達できない場合に呼び出されます。
この時点でキューに入れられた未送信のすべてのパケットはドロップされ、さらに送信を試みると、接続の確立が再試行されます 。(ただし、失敗した場合は再びドロップされます。)
P2PSessionRequest_t
A user wants to communicate with us over the P2P channel via the
SendP2PPacket. In response, a call to
AcceptP2PSessionWithUser needs to be made, if you want to open the network channel with them.
名前 | 型 | 説明 |
m_steamIDRemote | CSteamID | P2Pセッションを開始したいユーザー。 |
関連する関数: SendP2PPacketSocketStatusCallback_t
ソケットのステータスが変更した場合に呼び出されます。
CreateListenSocketと
CreateP2PConnectionSocket呼び出しの一部として使用されます。
これは、Berkley TCPソケットモデルを中心に設計された古い関数セットの一部です。 これら古い関数は将来的に削除されるため、より堅牢なP2P関数の使用を推奨します。
名前 | 型 | 説明 |
m_hListenSocket | SNetSocket_t | リモートホストへのデータの送受信に使用されるソケット。 |
m_eSNetSocketState | SNetListenSocket_t | リッスンしていたサーバーソケットです。これが発信接続の場合にはNULLです。 |
m_steamIDRemote | CSteamID | あれば、接続した先のリモートSteam ID。 |
m_eP2PSessionError | int | ソケットの状態、ESNetSocketState |
構造体
これらは、ISteamNetworking内の関数が返す、またはやり取りする構造体です。
P2PSessionState_t
GetP2PSessionStateによって返される、指定したユーザーへの接続状況。 これは、以前の
SendP2PPacketへの呼び出しで何が起こっているかについての内部情報です。 デバッグ以外の目的では不要なはずです。
名前 | 型 | 説明 |
m_bConnectionActive | uint8 | ユーザーとアクティブなオープン接続がある(true)か、ない(false)か? |
m_bConnecting | uint8 | 現在ユーザーと接続を確立しようとしている(true)か、否(false)か? |
m_eP2PSessionError | uint8 | ソケットに記録された最後のエラー。 EP2PSessionErrorを返します。 |
m_bUsingRelay | uint8 | この接続はSteamリレーサーバーを介している (true)か、否 (false)か? |
m_nBytesQueuedForSend | int32 | ユーザーに送信するためにキューに入れられたバイト数。 |
m_nPacketsQueuedForSend | int32 | ユーザーに送信するためにキューに入れられたパケット数。 |
m_nRemoteIP | uint32 | 設定されていた場合にはリモートホストのIP。 Steamリレーサーバーの場合もあります。 これは、以前の認証APIとの互換性のためにのみ存在しています。 |
m_nRemotePort | uint16 | 設定されている場合、リモートホストのポート。 Steamリレーサーバーの場合もあります。 これは、以前の認証APIとの互換性のためにのみ存在しています。 |
列挙型
これらはISteamNetworkingで使用するために定義された列挙型です。
EP2PSend
SendP2PPacketの送信タイプを指定します。
通常UDPのようなパケットには
k_EP2PSendUnreliable
、
TCPのようなパケットには
k_EP2PSendReliable
です。
名前 | 値 | 説明 |
k_EP2PSendUnreliable | 0 | 基本的なUDP送信です。 パケットは1200バイト(通常のMTUサイズ)より大きくはできません。 紛失したり、稀に順不同で到達することがあります。 送信するAPIは、基礎となる接続についてある程度の知識を持っているため、NATトラバーサルが完了していない場合や接続で調整が認識されている場合、パケットは接続が再び開くまでバッチ処理されます。 |
k_EP2PSendUnreliableNoDelay | 1 | 上記と同様ですが、基礎となるP2P接続が確立されていない場合、パケットは破棄されます。 これをリモートホストに送信される最初のパケットで使用すると、パケットはほぼドロップされます。 絶対にバッファリングしない種類のデータ、例えば音声ペイロードパケット等、にのみ役に立ちます。 |
k_EP2PSendReliable | 2 | 信頼できるメッセージ送信。 1つのメッセージで最大1MBのデータを送信できます。 内部のメッセージの断片化/再構築、および大量のデータを効率的に送信するためのスライディングウィンドウを実行します。 |
k_EP2PSendReliableWithBuffering | 3 | 上記と同じですが、送信にNagleアルゴリズムを適用します- 現在のMTUサイズ(通常~1200バイト、変更可能)または~200msが経過するまで送信が蓄積されます(Nagleアルゴリズム)。 これは、一連の小さいメッセージを送信したいが、1つのパケットに合体させたい場合に便利です。 信頼できるストリームはすべて順序付けられているため、いくつかの小さなメッセージを k_EP2PSendReliableWithBuffering を使用して送信してから、通常のk_EP2PSendReliableを実行してすべてのバッファーデータを強制的に送信できます。 |
EP2PSessionError
SendP2PPacketが返す可能性のあるエラーのリスト。これらは、
P2PSessionConnectFail_tコールバック内で送信されます。
名前 | 値 | 説明 |
k_EP2PSessionErrorNone | 0 | エラーなし。 |
k_EP2PSessionErrorNotRunningApp | 1 | ターゲットユーザーが同じゲームを実行していません。 |
k_EP2PSessionErrorNoRightsToApp | 2 | ローカルユーザーは実行中のアプリを所有していません。 |
k_EP2PSessionErrorDestinationNotLoggedIn | 3 | ターゲットユーザーはSteamに接続していません。 |
k_EP2PSessionErrorNotRunningApp | 4 | ターゲットユーザーが応答しなかったため接続がタイムアウトしました。おそらくAcceptP2PSessionWithUserを呼び出し中です。 企業のファイアウォールもこれをブロックすることがあります (NATトラバーサルはファイアウォールトラバーサルではありません)。UDP ポート 3478, 4379, および4380が発信報告で開いていることを確認してください。 |
k_EP2PSessionErrorMax | 5 | 未使用。 |
ESNetSocketConnectionType
現在のソケットの接続を説明します。 古いNetworking APIでのみ使用されています。
名前 | 値 | 説明 |
k_ESNetSocketConnectionTypeNotConnected | 0 | |
k_ESNetSocketConnectionTypeNotConnected | 1 | |
k_ESNetSocketConnectionTypeUDP | 2 | |
ESNetSocketState
CreateP2PConnectionSocketによって使用される接続の進行状況のインジケーターです。
名前 | 値 | 説明 |
k_ESNetSocketStateInvalid | 0 | |
k_ESNetSocketStateChallengeHandshake | 1 | 通信は有効です |
k_ESNetSocketStateDisconnecting | 10 | 接続を確立中の状態 接続状態のマシーンが開始しました |
k_ESNetSocketStateInvalid | 11 | p2p接続 自身のローカルIP情報を見つけました |
k_ESNetSocketStateReceivedRemoteCandidates | 12 | Steamバックエンド経由でIP情報について、リモートマシーンから情報を受信しました。 |
k_ESNetSocketConnectionTypeUDPRelay | 15 | 直接接続 サーバーからチャレンジパケットを受信しました |
k_ESNetSocketStateConnectionBroken | 21 | 失敗状態 APIがシャットダウンし、もう一方の端に通知している最中です |
k_ESNetSocketStateLocalCandidatesFound | 22 | APIがシャットダウンし、シャットダウンを完了しました |
k_ESNetSocketStateTimeoutDuringConnect | 23 | 接続を確立しようとした際にタイムアウトしました。 |
k_ESNetSocketStateRemoteEndDisconnected | 24 | リモートエンドがこちらから断絶されました |
k_ESNetSocketStateConnected | 25 | 接続が切断されました。もう一方が消失したか、ローカルネットワーク接続が切断されました |
Typedefs
これらはISteamNetworkingで使用するために定義されたtypedefsです。
名前 | ベース型 | 説明 |
SNetListenSocket_t | uint32 | CreateListenSocket() |
SNetSocket_t | uint32 | ソケットへのハンドル CreateP2PConnectionSocket() |
定数
これらはISteamNetworkingで使用するために定義された定数です。
名前 | 型 | 値 | 説明 |
STEAMNETWORKING_INTERFACE_VERSION | const char * | "SteamNetworking005" | |