Socket.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. #pragma once
  2. #include <stdint.h>
  3. #include "il2cpp-config.h"
  4. #include "il2cpp-object-internals.h"
  5. struct Il2CppArray;
  6. struct Il2CppObject;
  7. struct Il2CppString;
  8. namespace il2cpp
  9. {
  10. namespace icalls
  11. {
  12. namespace System
  13. {
  14. namespace System
  15. {
  16. namespace Net
  17. {
  18. namespace Sockets
  19. {
  20. enum AddressFamily
  21. {
  22. kAddressFamilyUnknown = -1,
  23. kAddressFamilyUnspecified = 0,
  24. kAddressFamilyUnix = 1,
  25. kAddressFamilyInterNetwork = 2,
  26. kAddressFamilyImpLink = 3,
  27. kAddressFamilyPup = 4,
  28. kAddressFamilyChaos = 5,
  29. kAddressFamilyNS = 6,
  30. kAddressFamilyIpx = 6,
  31. kAddressFamilyIso = 7,
  32. kAddressFamilyOsi = 7,
  33. kAddressFamilyEcma = 8,
  34. kAddressFamilyDataKit = 9,
  35. kAddressFamilyCcitt = 10,
  36. kAddressFamilySna = 11,
  37. kAddressFamilyDecNet = 12,
  38. kAddressFamilyDataLink = 13,
  39. kAddressFamilyLat = 14,
  40. kAddressFamilyHyperChannel = 15,
  41. kAddressFamilyAppleTalk = 16,
  42. kAddressFamilyNetBios = 17,
  43. kAddressFamilyVoiceView = 18,
  44. kAddressFamilyFireFox = 19,
  45. kAddressFamilyBanyan = 21,
  46. kAddressFamilyAtm = 22,
  47. kAddressFamilyInterNetworkV6 = 23,
  48. kAddressFamilyCluster = 24,
  49. kAddressFamilyIeee12844 = 25,
  50. kAddressFamilyIrda = 26,
  51. kAddressFamilyNetworkDesigners = 28,
  52. kAddressFamilyMax = 29,
  53. };
  54. enum SocketType
  55. {
  56. kSocketTypeUnknown = -1,
  57. kSocketTypeStream = 1,
  58. kSocketTypeDgram = 2,
  59. kSocketTypeRaw = 3,
  60. kSocketTypeRdm = 4,
  61. kSocketTypeSeqpacket = 5,
  62. };
  63. enum ProtocolType
  64. {
  65. kProtocolTypeUnknown = -1,
  66. kProtocolTypeIP = 0,
  67. kProtocolTypeIcmp = 1,
  68. kProtocolTypeIgmp = 2,
  69. kProtocolTypeGgp = 3,
  70. kProtocolTypeTcp = 6,
  71. kProtocolTypePup = 12,
  72. kProtocolTypeUdp = 17,
  73. kProtocolTypeIdp = 22,
  74. kProtocolTypeND = 77,
  75. kProtocolTypeRaw = 255,
  76. kProtocolTypeUnspecified = 0,
  77. kProtocolTypeIpx = 1000,
  78. kProtocolTypeSpx = 1256,
  79. kProtocolTypeSpxII = 1257,
  80. // #if NET_1_1
  81. kProtocolTypeIPv6 = 41,
  82. // #endif
  83. // #if NET_2_0
  84. kProtocolTypeIPv4 = 4,
  85. kProtocolTypeIPv6RoutingHeader = 43,
  86. kProtocolTypeIPv6FragmentHeader = 44,
  87. kProtocolTypeIPSecEncapsulatingSecurityPayload = 50,
  88. kProtocolTypeIPSecAuthenticationHeader = 51,
  89. kProtocolTypeIcmpV6 = 58,
  90. kProtocolTypeIPv6NoNextHeader = 59,
  91. kProtocolTypeIPv6DestinationOptions = 60,
  92. kProtocolTypeIPv6HopByHopOptions = 0,
  93. // #endif
  94. };
  95. enum SocketOptionLevel
  96. {
  97. kSocketOptionLevelSocket = 65535,
  98. kSocketOptionLevelIP = 0,
  99. kSocketOptionLevelTcp = 6,
  100. kSocketOptionLevelUdp = 17,
  101. //#if NET_1_1
  102. kSocketOptionLevelIPv6 = 41,
  103. //#endif
  104. };
  105. enum SocketOptionName
  106. {
  107. kSocketOptionNameDebug = 1,
  108. kSocketOptionNameAcceptConnection = 2,
  109. kSocketOptionNameReuseAddress = 4,
  110. kSocketOptionNameKeepAlive = 8,
  111. kSocketOptionNameDontRoute = 16,
  112. kSocketOptionNameBroadcast = 32,
  113. kSocketOptionNameUseLoopback = 64,
  114. kSocketOptionNameLinger = 128,
  115. kSocketOptionNameOutOfBandInline = 256,
  116. kSocketOptionNameDontLinger = -129,
  117. kSocketOptionNameExclusiveAddressUse = -5,
  118. kSocketOptionNameSendBuffer = 4097,
  119. kSocketOptionNameReceiveBuffer = 4098,
  120. kSocketOptionNameSendLowWater = 4099,
  121. kSocketOptionNameReceiveLowWater = 4100,
  122. kSocketOptionNameSendTimeout = 4101,
  123. kSocketOptionNameReceiveTimeout = 4102,
  124. kSocketOptionNameError = 4103,
  125. kSocketOptionNameType = 4104,
  126. kSocketOptionNameMaxConnections = 2147483647,
  127. kSocketOptionNameIPOptions = 1,
  128. kSocketOptionNameHeaderIncluded = 2,
  129. kSocketOptionNameTypeOfService = 3,
  130. kSocketOptionNameIpTimeToLive = 4,
  131. kSocketOptionNameMulticastInterface = 9,
  132. kSocketOptionNameMulticastTimeToLive = 10,
  133. kSocketOptionNameMulticastLoopback = 11,
  134. kSocketOptionNameAddMembership = 12,
  135. kSocketOptionNameDropMembership = 13,
  136. kSocketOptionNameDontFragment = 14,
  137. kSocketOptionNameAddSourceMembership = 15,
  138. kSocketOptionNameDropSourceMembership = 16,
  139. kSocketOptionNameBlockSource = 17,
  140. kSocketOptionNameUnblockSource = 18,
  141. kSocketOptionNamePacketInformation = 19,
  142. kSocketOptionNameNoDelay = 1,
  143. kSocketOptionNameBsdUrgent = 2,
  144. kSocketOptionNameExpedited = 2,
  145. kSocketOptionNameNoChecksum = 1,
  146. kSocketOptionNameChecksumCoverage = 20,
  147. // #if NET_2_0
  148. kSocketOptionNameHopLimit = 21,
  149. kSocketOptionNameUpdateAcceptContext = 28683,
  150. kSocketOptionNameUpdateConnectContext = 28688,
  151. // #endif
  152. };
  153. enum SelectMode
  154. {
  155. kSelectModeSelectRead = 0,
  156. kSelectModeSelectWrite = 1,
  157. kSelectModeSelectError = 2,
  158. };
  159. enum SocketFlags
  160. {
  161. kSocketFlagsNone = 0x00000000,
  162. kSocketFlagsOutOfBand = 0x00000001,
  163. kSocketFlagsPeek = 0x00000002,
  164. kSocketFlagsDontRoute = 0x00000004,
  165. kSocketFlagsMaxIOVectorLength = 0x00000010,
  166. // #if NET_2_0
  167. kSocketFlagsTruncated = 0x00000100,
  168. kSocketFlagsControlDataTruncated = 0x00000200,
  169. kSocketFlagsBroadcast = 0x00000400,
  170. kSocketFlagsMulticast = 0x00000800,
  171. // #endif
  172. kSocketFlagsPartial = 0x00008000,
  173. };
  174. enum TransmitFileOptions
  175. {
  176. kTransmitFileOptionsUseDefaultWorkerThread = 0x00000000,
  177. kTransmitFileOptionsDisconnect = 0x00000001,
  178. kTransmitFileOptionsReuseSocket = 0x00000002,
  179. kTransmitFileOptionsWriteBehind = 0x00000004,
  180. kTransmitFileOptionsUseSystemThread = 0x00000010,
  181. kTransmitFileOptionsUseKernelApc = 0x00000020,
  182. };
  183. enum SocketShutdown
  184. {
  185. kSocketShutdownReceive = 0,
  186. kSocketShutdownSend = 1,
  187. kSocketShutdownBoth = 2,
  188. };
  189. class LIBIL2CPP_CODEGEN_API Socket
  190. {
  191. public:
  192. static intptr_t Accept(intptr_t, int32_t*, bool);
  193. static int32_t Available(intptr_t, int32_t*);
  194. static void Bind(intptr_t, Il2CppSocketAddress*, int32_t*);
  195. static void Blocking(intptr_t, bool, int32_t*);
  196. static void Close(intptr_t, int32_t*);
  197. static void Connect(intptr_t, Il2CppSocketAddress*, int32_t*);
  198. static void Disconnect(intptr_t, bool, int32_t*);
  199. static void GetSocketOptionArray(intptr_t, SocketOptionLevel, SocketOptionName, Il2CppArray**, int32_t*);
  200. static void GetSocketOptionObj(intptr_t, SocketOptionLevel, SocketOptionName, Il2CppObject**, int32_t*);
  201. static void Listen(intptr_t, int32_t, int32_t*);
  202. static Il2CppSocketAddress* LocalEndPoint(intptr_t, int32_t*);
  203. static bool Poll(intptr_t, SelectMode, int32_t, int32_t*);
  204. static int32_t ReceiveArray(intptr_t, Il2CppArray*, SocketFlags, int32_t*);
  205. static int32_t Receive(intptr_t, Il2CppArray*, int32_t, int32_t, SocketFlags, int32_t*);
  206. static int32_t RecvFrom(intptr_t, Il2CppArray*, int32_t, int32_t, SocketFlags, Il2CppSocketAddress**, int32_t*);
  207. static Il2CppSocketAddress* RemoteEndPoint(intptr_t, int32_t*);
  208. static void Select(Il2CppArray**, int32_t, int32_t*);
  209. static bool SendFile(intptr_t, Il2CppString*, Il2CppArray*, Il2CppArray*, TransmitFileOptions);
  210. static int32_t SendTo(intptr_t, Il2CppArray*, int32_t, int32_t, SocketFlags, Il2CppSocketAddress*, int32_t*);
  211. static int32_t SendArray(intptr_t, Il2CppArray*, SocketFlags, int32_t*);
  212. static int32_t Send(intptr_t, Il2CppArray*, int32_t, int32_t, SocketFlags, int32_t*);
  213. static void SetSocketOption(intptr_t, SocketOptionLevel, SocketOptionName, Il2CppObject*, Il2CppArray*, int32_t, int32_t*);
  214. static void Shutdown(intptr_t, SocketShutdown, int32_t*);
  215. static intptr_t Socket_internal(Il2CppObject * self, AddressFamily, SocketType, ProtocolType, int32_t*);
  216. static int32_t WSAIoctl(intptr_t, int32_t, Il2CppArray*, Il2CppArray*, int32_t*);
  217. static bool SendFile_internal(intptr_t sock, Il2CppString* filename, Il2CppArray* pre_buffer, Il2CppArray* post_buffer, int32_t flags, int32_t* error, bool blocking);
  218. static bool SupportsPortReuse(ProtocolType proto);
  219. static int32_t IOControl_internal(intptr_t sock, int32_t ioctl_code, Il2CppArray* input, Il2CppArray* output, int32_t* error);
  220. static int32_t ReceiveFrom_internal(intptr_t sock, uint8_t* buffer, int32_t count, SocketFlags flags, Il2CppSocketAddress** sockaddr, int32_t* error, bool blocking);
  221. static int32_t SendTo_internal(intptr_t sock, uint8_t* buffer, int32_t count, SocketFlags flags, Il2CppSocketAddress* sa, int32_t* error, bool blocking);
  222. static Il2CppSocketAddress* LocalEndPoint_internal(intptr_t socket, int32_t family, int32_t* error);
  223. static Il2CppSocketAddress* RemoteEndPoint_internal(intptr_t socket, int32_t family, int32_t* error);
  224. static void cancel_blocking_socket_operation(Il2CppObject* thread);
  225. static void Connect_internal(intptr_t sock, Il2CppSocketAddress* sa, int32_t* error, bool blocking);
  226. static bool Duplicate_internal(intptr_t handle, int32_t targetProcessId, intptr_t *duplicate_handle, int32_t *werror);
  227. static int32_t ReceiveArray40(intptr_t, void*, int32_t, SocketFlags, int32_t*, bool);
  228. static int32_t Receive40(intptr_t, uint8_t*, int32_t, SocketFlags, int32_t*, bool);
  229. static int32_t SendArray40(intptr_t, void*, int32_t, SocketFlags, int32_t*, bool);
  230. static int32_t Send40(intptr_t, uint8_t*, int32_t, SocketFlags, int32_t*, bool);
  231. static bool IsProtocolSupported_internal(int32_t networkInterface);
  232. };
  233. } /* namespace Sockets */
  234. } /* namespace Net */
  235. } /* namespace System */
  236. } /* namespace System */
  237. } /* namespace icalls */
  238. } /* namespace il2cpp */