_socket.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. #include "PikaPlatform_socket.h"
  2. #include "_socket_socket.h"
  3. #if !PIKASCRIPT_VERSION_REQUIRE_MINIMUN(1, 12, 0)
  4. #error "This library requires PikaScript version 1.12.0 or higher"
  5. #endif
  6. void _socket_socket__init(PikaObj* self) {
  7. int family = obj_getInt(self, "family");
  8. int type = obj_getInt(self, "type");
  9. int protocol = obj_getInt(self, "protocol");
  10. int sockfd = 0;
  11. sockfd = __platform_socket(family, type, protocol);
  12. if (sockfd < 0) {
  13. obj_setErrorCode(self, PIKA_RES_ERR_RUNTIME_ERROR);
  14. __platform_printf("socket error\n");
  15. return;
  16. }
  17. obj_setInt(self, "sockfd", sockfd);
  18. obj_setInt(self, "blocking", 1);
  19. }
  20. void _socket_socket__close(PikaObj* self) {
  21. int sockfd = obj_getInt(self, "sockfd");
  22. __platform_close(sockfd);
  23. }
  24. void _socket_socket__send(PikaObj* self, Arg* data) {
  25. uint8_t* data_send = NULL;
  26. int len = 0;
  27. if (arg_getType(data) == ARG_TYPE_STRING) {
  28. data_send = (uint8_t*)arg_getStr(data);
  29. len = strGetSize((char*)data_send);
  30. }
  31. if (arg_getType(data) == ARG_TYPE_BYTES) {
  32. data_send = (uint8_t*)arg_getBytes(data);
  33. len = arg_getBytesSize(data);
  34. }
  35. int sockfd = obj_getInt(self, "sockfd");
  36. int ret = 0;
  37. ret = __platform_send(sockfd, data_send, len, 0);
  38. if (ret < 0) {
  39. obj_setErrorCode(self, PIKA_RES_ERR_RUNTIME_ERROR);
  40. __platform_printf("send error\n");
  41. return;
  42. }
  43. }
  44. void _socket_socket__accept(PikaObj* self) {
  45. int sockfd = obj_getInt(self, "sockfd");
  46. int client_sockfd = 0;
  47. struct sockaddr_in client_addr;
  48. socklen_t client_addr_len = sizeof(client_addr);
  49. pika_GIL_EXIT();
  50. client_sockfd = __platform_accept(sockfd, (struct sockaddr*)&client_addr,
  51. &client_addr_len);
  52. pika_GIL_ENTER();
  53. if (client_sockfd < 0) {
  54. obj_setErrorCode(self, PIKA_RES_ERR_RUNTIME_ERROR);
  55. __platform_printf("accept error\n");
  56. return;
  57. }
  58. obj_setInt(self, "client_sockfd", client_sockfd);
  59. obj_setStr(self, "client_addr", inet_ntoa(client_addr.sin_addr));
  60. }
  61. Arg* _socket_socket__recv(PikaObj* self, int num) {
  62. int sockfd = obj_getInt(self, "sockfd");
  63. int ret = 0;
  64. uint8_t* data_recv = NULL;
  65. Arg* res = arg_newBytes(NULL, num);
  66. data_recv = arg_getBytes(res);
  67. pika_GIL_EXIT();
  68. ret = __platform_recv(sockfd, data_recv, num, 0);
  69. pika_GIL_ENTER();
  70. if (ret <= 0) {
  71. if (obj_getInt(self, "blocking")) {
  72. obj_setErrorCode(self, PIKA_RES_ERR_RUNTIME_ERROR);
  73. if (ret == 0){
  74. // __platform_printf("connect closed\n");
  75. }else{
  76. __platform_printf("recv error: %d\n", ret);
  77. }
  78. arg_deinit(res);
  79. return NULL;
  80. } else {
  81. Arg* res_r = arg_newBytes(NULL, 0);
  82. arg_deinit(res);
  83. return res_r;
  84. }
  85. } else {
  86. if (ret < num) {
  87. uint8_t* res_buff = NULL;
  88. Arg* res_r = arg_newBytes(NULL, ret);
  89. res_buff = arg_getBytes(res_r);
  90. pika_platform_memcpy(res_buff, data_recv, ret);
  91. arg_deinit(res);
  92. return res_r;
  93. }
  94. }
  95. return res;
  96. }
  97. void _socket_socket__listen(PikaObj* self, int num) {
  98. int sockfd = obj_getInt(self, "sockfd");
  99. __platform_listen(sockfd, num);
  100. }
  101. void _socket_socket__connect(PikaObj* self, char* host, int port) {
  102. int sockfd = obj_getInt(self, "sockfd");
  103. struct sockaddr_in server_addr;
  104. server_addr.sin_family = AF_INET;
  105. server_addr.sin_port = htons(port);
  106. server_addr.sin_addr.s_addr = inet_addr(host);
  107. pika_GIL_EXIT();
  108. int err = pika_platform_connect(sockfd, (struct sockaddr*)&server_addr,
  109. sizeof(server_addr));
  110. pika_GIL_ENTER();
  111. if (0 != err) {
  112. obj_setErrorCode(self, PIKA_RES_ERR_RUNTIME_ERROR);
  113. pika_platform_printf("connect error, err = %d\n", err);
  114. return;
  115. }
  116. if (obj_getInt(self, "blocking") == 0) {
  117. int flags = fcntl(sockfd, F_GETFL, 0);
  118. if (fcntl(sockfd, F_SETFL, flags | O_NONBLOCK) == -1) {
  119. obj_setErrorCode(self, PIKA_RES_ERR_RUNTIME_ERROR);
  120. pika_platform_printf("Unable to set socket non blocking\n");
  121. return;
  122. }
  123. }
  124. }
  125. void _socket_socket__bind(PikaObj* self, char* host, int port) {
  126. int sockfd = obj_getInt(self, "sockfd");
  127. struct sockaddr_in server_addr;
  128. server_addr.sin_family = AF_INET;
  129. server_addr.sin_port = htons(port);
  130. server_addr.sin_addr.s_addr = inet_addr(host);
  131. int res = __platform_bind(sockfd, (struct sockaddr*)&server_addr,
  132. sizeof(server_addr));
  133. if (res < 0) {
  134. obj_setErrorCode(self, PIKA_RES_ERR_RUNTIME_ERROR);
  135. __platform_printf("bind error\n");
  136. return;
  137. }
  138. }
  139. char* _socket__gethostname(PikaObj* self) {
  140. char hostname_buff[128] = {0};
  141. char* hostname = (char*)hostname_buff;
  142. __platform_gethostname(hostname_buff, 128);
  143. return obj_cacheStr(self, hostname);
  144. }
  145. void _socket_socket__setblocking(PikaObj* self, int sta) {
  146. obj_setInt(self, "blocking", sta);
  147. }