_socket.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #include "_socket_socket.h"
  2. #include "PikaPlatform_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. }
  19. void _socket_socket__close(PikaObj* self) {
  20. int sockfd = obj_getInt(self, "sockfd");
  21. __platform_close(sockfd);
  22. }
  23. void _socket_socket__send(PikaObj* self, Arg* data) {
  24. uint8_t* data_send = NULL;
  25. int len = 0;
  26. if (arg_getType(data) == ARG_TYPE_STRING) {
  27. data_send = (uint8_t*)arg_getStr(data);
  28. len = strGetSize((char*)data_send);
  29. }
  30. if (arg_getType(data) == ARG_TYPE_BYTES) {
  31. data_send = (uint8_t*)arg_getBytes(data);
  32. len = arg_getBytesSize(data);
  33. }
  34. int sockfd = obj_getInt(self, "sockfd");
  35. int ret = 0;
  36. ret = __platform_send(sockfd, data_send, len, 0);
  37. if (ret < 0) {
  38. obj_setErrorCode(self, PIKA_RES_ERR_RUNTIME_ERROR);
  39. __platform_printf("send error\n");
  40. return;
  41. }
  42. }
  43. void _socket_socket__accept(PikaObj* self) {
  44. int sockfd = obj_getInt(self, "sockfd");
  45. int client_sockfd = 0;
  46. struct sockaddr_in client_addr;
  47. socklen_t client_addr_len = sizeof(client_addr);
  48. client_sockfd = __platform_accept(sockfd, (struct sockaddr*)&client_addr,
  49. &client_addr_len);
  50. if (client_sockfd < 0) {
  51. obj_setErrorCode(self, PIKA_RES_ERR_RUNTIME_ERROR);
  52. __platform_printf("accept error\n");
  53. return;
  54. }
  55. obj_setInt(self, "client_sockfd", client_sockfd);
  56. obj_setStr(self, "client_addr", inet_ntoa(client_addr.sin_addr));
  57. }
  58. Arg* _socket_socket__recv(PikaObj* self, int num) {
  59. int sockfd = obj_getInt(self, "sockfd");
  60. int ret = 0;
  61. uint8_t* data_recv = NULL;
  62. Arg* res = arg_newBytes(NULL, num);
  63. data_recv = arg_getBytes(res);
  64. ret = __platform_recv(sockfd, data_recv, num, 0);
  65. if (ret < 0) {
  66. obj_setErrorCode(self, PIKA_RES_ERR_RUNTIME_ERROR);
  67. __platform_printf("recv error\n");
  68. return NULL;
  69. }
  70. return res;
  71. }
  72. void _socket_socket__listen(PikaObj* self, int num) {
  73. int sockfd = obj_getInt(self, "sockfd");
  74. __platform_listen(sockfd, num);
  75. }
  76. void _socket_socket__connect(PikaObj* self, char* host, int port) {
  77. int sockfd = obj_getInt(self, "sockfd");
  78. struct sockaddr_in server_addr;
  79. server_addr.sin_family = AF_INET;
  80. server_addr.sin_port = htons(port);
  81. server_addr.sin_addr.s_addr = inet_addr(host);
  82. __platform_connect(sockfd, (struct sockaddr*)&server_addr,
  83. sizeof(server_addr));
  84. }
  85. void _socket_socket__bind(PikaObj* self, char* host, int port) {
  86. int sockfd = obj_getInt(self, "sockfd");
  87. struct sockaddr_in server_addr;
  88. server_addr.sin_family = AF_INET;
  89. server_addr.sin_port = htons(port);
  90. server_addr.sin_addr.s_addr = inet_addr(host);
  91. int res = __platform_bind(sockfd, (struct sockaddr*)&server_addr,
  92. sizeof(server_addr));
  93. if (res < 0) {
  94. obj_setErrorCode(self, PIKA_RES_ERR_RUNTIME_ERROR);
  95. __platform_printf("bind error\n");
  96. return;
  97. }
  98. }
  99. char* _socket__gethostname(PikaObj* self) {
  100. char hostname_buff[128] = {0};
  101. char* hostname = (char*)hostname_buff;
  102. __platform_gethostname(hostname_buff, 128);
  103. return obj_cacheStr(self, hostname);
  104. }