isteamgameservernetworking.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. // This file is provided under The MIT License as part of Steamworks.NET.
  2. // Copyright (c) 2013-2019 Riley Labrecque
  3. // Please see the included LICENSE.txt for additional information.
  4. // This file is automatically generated.
  5. // Changes to this file will be reverted when you update Steamworks.NET
  6. #if UNITY_ANDROID || UNITY_IOS || UNITY_TIZEN || UNITY_TVOS || UNITY_WEBGL || UNITY_WSA || UNITY_PS4 || UNITY_WII || UNITY_XBOXONE || UNITY_SWITCH
  7. #define DISABLESTEAMWORKS
  8. #endif
  9. #if !DISABLESTEAMWORKS
  10. using System.Runtime.InteropServices;
  11. using IntPtr = System.IntPtr;
  12. namespace Steamworks {
  13. public static class SteamGameServerNetworking {
  14. /// <summary>
  15. /// <para>//////////////////////////////////////////////////////////////////////////////////////////</para>
  16. /// <para> UDP-style (connectionless) networking interface. These functions send messages using</para>
  17. /// <para> an API organized around the destination. Reliable and unreliable messages are supported.</para>
  18. /// <para> For a more TCP-style interface (meaning you have a connection handle), see the functions below.</para>
  19. /// <para> Both interface styles can send both reliable and unreliable messages.</para>
  20. /// <para> Automatically establishes NAT-traversing or Relay server connections</para>
  21. /// <para> Sends a P2P packet to the specified user</para>
  22. /// <para> UDP-like, unreliable and a max packet size of 1200 bytes</para>
  23. /// <para> the first packet send may be delayed as the NAT-traversal code runs</para>
  24. /// <para> if we can't get through to the user, an error will be posted via the callback P2PSessionConnectFail_t</para>
  25. /// <para> see EP2PSend enum above for the descriptions of the different ways of sending packets</para>
  26. /// <para> nChannel is a routing number you can use to help route message to different systems - you'll have to call ReadP2PPacket()</para>
  27. /// <para> with the same channel number in order to retrieve the data on the other end</para>
  28. /// <para> using different channels to talk to the same user will still use the same underlying p2p connection, saving on resources</para>
  29. /// </summary>
  30. public static bool SendP2PPacket(CSteamID steamIDRemote, byte[] pubData, uint cubData, EP2PSend eP2PSendType, int nChannel = 0) {
  31. InteropHelp.TestIfAvailableGameServer();
  32. return NativeMethods.ISteamNetworking_SendP2PPacket(CSteamGameServerAPIContext.GetSteamNetworking(), steamIDRemote, pubData, cubData, eP2PSendType, nChannel);
  33. }
  34. /// <summary>
  35. /// <para> returns true if any data is available for read, and the amount of data that will need to be read</para>
  36. /// </summary>
  37. public static bool IsP2PPacketAvailable(out uint pcubMsgSize, int nChannel = 0) {
  38. InteropHelp.TestIfAvailableGameServer();
  39. return NativeMethods.ISteamNetworking_IsP2PPacketAvailable(CSteamGameServerAPIContext.GetSteamNetworking(), out pcubMsgSize, nChannel);
  40. }
  41. /// <summary>
  42. /// <para> reads in a packet that has been sent from another user via SendP2PPacket()</para>
  43. /// <para> returns the size of the message and the steamID of the user who sent it in the last two parameters</para>
  44. /// <para> if the buffer passed in is too small, the message will be truncated</para>
  45. /// <para> this call is not blocking, and will return false if no data is available</para>
  46. /// </summary>
  47. public static bool ReadP2PPacket(byte[] pubDest, uint cubDest, out uint pcubMsgSize, out CSteamID psteamIDRemote, int nChannel = 0) {
  48. InteropHelp.TestIfAvailableGameServer();
  49. return NativeMethods.ISteamNetworking_ReadP2PPacket(CSteamGameServerAPIContext.GetSteamNetworking(), pubDest, cubDest, out pcubMsgSize, out psteamIDRemote, nChannel);
  50. }
  51. /// <summary>
  52. /// <para> AcceptP2PSessionWithUser() should only be called in response to a P2PSessionRequest_t callback</para>
  53. /// <para> P2PSessionRequest_t will be posted if another user tries to send you a packet that you haven't talked to yet</para>
  54. /// <para> if you don't want to talk to the user, just ignore the request</para>
  55. /// <para> if the user continues to send you packets, another P2PSessionRequest_t will be posted periodically</para>
  56. /// <para> this may be called multiple times for a single user</para>
  57. /// <para> (if you've called SendP2PPacket() on the other user, this implicitly accepts the session request)</para>
  58. /// </summary>
  59. public static bool AcceptP2PSessionWithUser(CSteamID steamIDRemote) {
  60. InteropHelp.TestIfAvailableGameServer();
  61. return NativeMethods.ISteamNetworking_AcceptP2PSessionWithUser(CSteamGameServerAPIContext.GetSteamNetworking(), steamIDRemote);
  62. }
  63. /// <summary>
  64. /// <para> call CloseP2PSessionWithUser() when you're done talking to a user, will free up resources under-the-hood</para>
  65. /// <para> if the remote user tries to send data to you again, another P2PSessionRequest_t callback will be posted</para>
  66. /// </summary>
  67. public static bool CloseP2PSessionWithUser(CSteamID steamIDRemote) {
  68. InteropHelp.TestIfAvailableGameServer();
  69. return NativeMethods.ISteamNetworking_CloseP2PSessionWithUser(CSteamGameServerAPIContext.GetSteamNetworking(), steamIDRemote);
  70. }
  71. /// <summary>
  72. /// <para> call CloseP2PChannelWithUser() when you're done talking to a user on a specific channel. Once all channels</para>
  73. /// <para> open channels to a user have been closed, the open session to the user will be closed and new data from this</para>
  74. /// <para> user will trigger a P2PSessionRequest_t callback</para>
  75. /// </summary>
  76. public static bool CloseP2PChannelWithUser(CSteamID steamIDRemote, int nChannel) {
  77. InteropHelp.TestIfAvailableGameServer();
  78. return NativeMethods.ISteamNetworking_CloseP2PChannelWithUser(CSteamGameServerAPIContext.GetSteamNetworking(), steamIDRemote, nChannel);
  79. }
  80. /// <summary>
  81. /// <para> fills out P2PSessionState_t structure with details about the underlying connection to the user</para>
  82. /// <para> should only needed for debugging purposes</para>
  83. /// <para> returns false if no connection exists to the specified user</para>
  84. /// </summary>
  85. public static bool GetP2PSessionState(CSteamID steamIDRemote, out P2PSessionState_t pConnectionState) {
  86. InteropHelp.TestIfAvailableGameServer();
  87. return NativeMethods.ISteamNetworking_GetP2PSessionState(CSteamGameServerAPIContext.GetSteamNetworking(), steamIDRemote, out pConnectionState);
  88. }
  89. /// <summary>
  90. /// <para> Allow P2P connections to fall back to being relayed through the Steam servers if a direct connection</para>
  91. /// <para> or NAT-traversal cannot be established. Only applies to connections created after setting this value,</para>
  92. /// <para> or to existing connections that need to automatically reconnect after this value is set.</para>
  93. /// <para> P2P packet relay is allowed by default</para>
  94. /// </summary>
  95. public static bool AllowP2PPacketRelay(bool bAllow) {
  96. InteropHelp.TestIfAvailableGameServer();
  97. return NativeMethods.ISteamNetworking_AllowP2PPacketRelay(CSteamGameServerAPIContext.GetSteamNetworking(), bAllow);
  98. }
  99. /// <summary>
  100. /// <para>//////////////////////////////////////////////////////////////////////////////////////////</para>
  101. /// <para> LISTEN / CONNECT connection-oriented interface functions</para>
  102. /// <para> These functions are more like a client-server TCP API. One side is the "server"</para>
  103. /// <para> and "listens" for incoming connections, which then must be "accepted." The "client"</para>
  104. /// <para> initiates a connection by "connecting." Sending and receiving is done through a</para>
  105. /// <para> connection handle.</para>
  106. /// <para> For a more UDP-style interface, where you do not track connection handles but</para>
  107. /// <para> simply send messages to a SteamID, use the UDP-style functions above.</para>
  108. /// <para> Both methods can send both reliable and unreliable methods.</para>
  109. /// <para>//////////////////////////////////////////////////////////////////////////////////////////</para>
  110. /// <para> creates a socket and listens others to connect</para>
  111. /// <para> will trigger a SocketStatusCallback_t callback on another client connecting</para>
  112. /// <para> nVirtualP2PPort is the unique ID that the client will connect to, in case you have multiple ports</para>
  113. /// <para> this can usually just be 0 unless you want multiple sets of connections</para>
  114. /// <para> unIP is the local IP address to bind to</para>
  115. /// <para> pass in 0 if you just want the default local IP</para>
  116. /// <para> unPort is the port to use</para>
  117. /// <para> pass in 0 if you don't want users to be able to connect via IP/Port, but expect to be always peer-to-peer connections only</para>
  118. /// </summary>
  119. public static SNetListenSocket_t CreateListenSocket(int nVirtualP2PPort, uint nIP, ushort nPort, bool bAllowUseOfPacketRelay) {
  120. InteropHelp.TestIfAvailableGameServer();
  121. return (SNetListenSocket_t)NativeMethods.ISteamNetworking_CreateListenSocket(CSteamGameServerAPIContext.GetSteamNetworking(), nVirtualP2PPort, nIP, nPort, bAllowUseOfPacketRelay);
  122. }
  123. /// <summary>
  124. /// <para> creates a socket and begin connection to a remote destination</para>
  125. /// <para> can connect via a known steamID (client or game server), or directly to an IP</para>
  126. /// <para> on success will trigger a SocketStatusCallback_t callback</para>
  127. /// <para> on failure or timeout will trigger a SocketStatusCallback_t callback with a failure code in m_eSNetSocketState</para>
  128. /// </summary>
  129. public static SNetSocket_t CreateP2PConnectionSocket(CSteamID steamIDTarget, int nVirtualPort, int nTimeoutSec, bool bAllowUseOfPacketRelay) {
  130. InteropHelp.TestIfAvailableGameServer();
  131. return (SNetSocket_t)NativeMethods.ISteamNetworking_CreateP2PConnectionSocket(CSteamGameServerAPIContext.GetSteamNetworking(), steamIDTarget, nVirtualPort, nTimeoutSec, bAllowUseOfPacketRelay);
  132. }
  133. public static SNetSocket_t CreateConnectionSocket(uint nIP, ushort nPort, int nTimeoutSec) {
  134. InteropHelp.TestIfAvailableGameServer();
  135. return (SNetSocket_t)NativeMethods.ISteamNetworking_CreateConnectionSocket(CSteamGameServerAPIContext.GetSteamNetworking(), nIP, nPort, nTimeoutSec);
  136. }
  137. /// <summary>
  138. /// <para> disconnects the connection to the socket, if any, and invalidates the handle</para>
  139. /// <para> any unread data on the socket will be thrown away</para>
  140. /// <para> if bNotifyRemoteEnd is set, socket will not be completely destroyed until the remote end acknowledges the disconnect</para>
  141. /// </summary>
  142. public static bool DestroySocket(SNetSocket_t hSocket, bool bNotifyRemoteEnd) {
  143. InteropHelp.TestIfAvailableGameServer();
  144. return NativeMethods.ISteamNetworking_DestroySocket(CSteamGameServerAPIContext.GetSteamNetworking(), hSocket, bNotifyRemoteEnd);
  145. }
  146. /// <summary>
  147. /// <para> destroying a listen socket will automatically kill all the regular sockets generated from it</para>
  148. /// </summary>
  149. public static bool DestroyListenSocket(SNetListenSocket_t hSocket, bool bNotifyRemoteEnd) {
  150. InteropHelp.TestIfAvailableGameServer();
  151. return NativeMethods.ISteamNetworking_DestroyListenSocket(CSteamGameServerAPIContext.GetSteamNetworking(), hSocket, bNotifyRemoteEnd);
  152. }
  153. /// <summary>
  154. /// <para> sending data</para>
  155. /// <para> must be a handle to a connected socket</para>
  156. /// <para> data is all sent via UDP, and thus send sizes are limited to 1200 bytes; after this, many routers will start dropping packets</para>
  157. /// <para> use the reliable flag with caution; although the resend rate is pretty aggressive,</para>
  158. /// <para> it can still cause stalls in receiving data (like TCP)</para>
  159. /// </summary>
  160. public static bool SendDataOnSocket(SNetSocket_t hSocket, byte[] pubData, uint cubData, bool bReliable) {
  161. InteropHelp.TestIfAvailableGameServer();
  162. return NativeMethods.ISteamNetworking_SendDataOnSocket(CSteamGameServerAPIContext.GetSteamNetworking(), hSocket, pubData, cubData, bReliable);
  163. }
  164. /// <summary>
  165. /// <para> receiving data</para>
  166. /// <para> returns false if there is no data remaining</para>
  167. /// <para> fills out *pcubMsgSize with the size of the next message, in bytes</para>
  168. /// </summary>
  169. public static bool IsDataAvailableOnSocket(SNetSocket_t hSocket, out uint pcubMsgSize) {
  170. InteropHelp.TestIfAvailableGameServer();
  171. return NativeMethods.ISteamNetworking_IsDataAvailableOnSocket(CSteamGameServerAPIContext.GetSteamNetworking(), hSocket, out pcubMsgSize);
  172. }
  173. /// <summary>
  174. /// <para> fills in pubDest with the contents of the message</para>
  175. /// <para> messages are always complete, of the same size as was sent (i.e. packetized, not streaming)</para>
  176. /// <para> if *pcubMsgSize &lt; cubDest, only partial data is written</para>
  177. /// <para> returns false if no data is available</para>
  178. /// </summary>
  179. public static bool RetrieveDataFromSocket(SNetSocket_t hSocket, byte[] pubDest, uint cubDest, out uint pcubMsgSize) {
  180. InteropHelp.TestIfAvailableGameServer();
  181. return NativeMethods.ISteamNetworking_RetrieveDataFromSocket(CSteamGameServerAPIContext.GetSteamNetworking(), hSocket, pubDest, cubDest, out pcubMsgSize);
  182. }
  183. /// <summary>
  184. /// <para> checks for data from any socket that has been connected off this listen socket</para>
  185. /// <para> returns false if there is no data remaining</para>
  186. /// <para> fills out *pcubMsgSize with the size of the next message, in bytes</para>
  187. /// <para> fills out *phSocket with the socket that data is available on</para>
  188. /// </summary>
  189. public static bool IsDataAvailable(SNetListenSocket_t hListenSocket, out uint pcubMsgSize, out SNetSocket_t phSocket) {
  190. InteropHelp.TestIfAvailableGameServer();
  191. return NativeMethods.ISteamNetworking_IsDataAvailable(CSteamGameServerAPIContext.GetSteamNetworking(), hListenSocket, out pcubMsgSize, out phSocket);
  192. }
  193. /// <summary>
  194. /// <para> retrieves data from any socket that has been connected off this listen socket</para>
  195. /// <para> fills in pubDest with the contents of the message</para>
  196. /// <para> messages are always complete, of the same size as was sent (i.e. packetized, not streaming)</para>
  197. /// <para> if *pcubMsgSize &lt; cubDest, only partial data is written</para>
  198. /// <para> returns false if no data is available</para>
  199. /// <para> fills out *phSocket with the socket that data is available on</para>
  200. /// </summary>
  201. public static bool RetrieveData(SNetListenSocket_t hListenSocket, byte[] pubDest, uint cubDest, out uint pcubMsgSize, out SNetSocket_t phSocket) {
  202. InteropHelp.TestIfAvailableGameServer();
  203. return NativeMethods.ISteamNetworking_RetrieveData(CSteamGameServerAPIContext.GetSteamNetworking(), hListenSocket, pubDest, cubDest, out pcubMsgSize, out phSocket);
  204. }
  205. /// <summary>
  206. /// <para> returns information about the specified socket, filling out the contents of the pointers</para>
  207. /// </summary>
  208. public static bool GetSocketInfo(SNetSocket_t hSocket, out CSteamID pSteamIDRemote, out int peSocketStatus, out uint punIPRemote, out ushort punPortRemote) {
  209. InteropHelp.TestIfAvailableGameServer();
  210. return NativeMethods.ISteamNetworking_GetSocketInfo(CSteamGameServerAPIContext.GetSteamNetworking(), hSocket, out pSteamIDRemote, out peSocketStatus, out punIPRemote, out punPortRemote);
  211. }
  212. /// <summary>
  213. /// <para> returns which local port the listen socket is bound to</para>
  214. /// <para> *pnIP and *pnPort will be 0 if the socket is set to listen for P2P connections only</para>
  215. /// </summary>
  216. public static bool GetListenSocketInfo(SNetListenSocket_t hListenSocket, out uint pnIP, out ushort pnPort) {
  217. InteropHelp.TestIfAvailableGameServer();
  218. return NativeMethods.ISteamNetworking_GetListenSocketInfo(CSteamGameServerAPIContext.GetSteamNetworking(), hListenSocket, out pnIP, out pnPort);
  219. }
  220. /// <summary>
  221. /// <para> returns true to describe how the socket ended up connecting</para>
  222. /// </summary>
  223. public static ESNetSocketConnectionType GetSocketConnectionType(SNetSocket_t hSocket) {
  224. InteropHelp.TestIfAvailableGameServer();
  225. return NativeMethods.ISteamNetworking_GetSocketConnectionType(CSteamGameServerAPIContext.GetSteamNetworking(), hSocket);
  226. }
  227. /// <summary>
  228. /// <para> max packet size, in bytes</para>
  229. /// </summary>
  230. public static int GetMaxPacketSize(SNetSocket_t hSocket) {
  231. InteropHelp.TestIfAvailableGameServer();
  232. return NativeMethods.ISteamNetworking_GetMaxPacketSize(CSteamGameServerAPIContext.GetSteamNetworking(), hSocket);
  233. }
  234. }
  235. }
  236. #endif // !DISABLESTEAMWORKS