socket.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #include "pocketpy/common/socket.h"
  2. #if PK_ENABLE_OS
  3. #include <stddef.h>
  4. #if defined (_WIN32) || defined (_WIN64)
  5. #include <WinSock2.h>
  6. #include <ws2tcpip.h>
  7. typedef SOCKET socket_fd;
  8. #else
  9. #include <sys/types.h>
  10. #include <sys/socket.h>
  11. #include <netinet/in.h>
  12. #include <arpa/inet.h>
  13. #include <fcntl.h>
  14. #include <unistd.h>
  15. #include <errno.h>
  16. typedef int socket_fd;
  17. #endif
  18. #define SOCKET_HANDLERTOFD(handler) (socket_fd)(uintptr_t)(handler)
  19. #define SOCKET_FDTOHANDLER(fd) (c11_socket_handler)(uintptr_t)(fd)
  20. static int c11_socket_init(){
  21. #if defined (_WIN32) || defined (_WIN64)
  22. WORD sockVersion = MAKEWORD(2,2);
  23. WSADATA wsaData;
  24. return WSAStartup(sockVersion, &wsaData);
  25. #endif
  26. return 0;
  27. }
  28. c11_socket_handler c11_socket_create(int family, int type, int protocol){
  29. static int is_initialized = 0;
  30. if(is_initialized == 0)
  31. {
  32. c11_socket_init();
  33. is_initialized = 1;
  34. }
  35. return SOCKET_FDTOHANDLER(socket(family, type, protocol));
  36. }
  37. int c11_socket_bind(c11_socket_handler socket, const char* hostname, unsigned short port){
  38. struct sockaddr_in bind_addr;
  39. bind_addr.sin_family = AF_INET;
  40. bind_addr.sin_port = htons(port);
  41. inet_pton(AF_INET,hostname,&bind_addr.sin_addr);
  42. if(bind(SOCKET_HANDLERTOFD(socket), (const struct sockaddr*)&bind_addr, sizeof(bind_addr)) == -1){
  43. return -1;
  44. }
  45. return 0;
  46. }
  47. int c11_socket_listen(c11_socket_handler socket, int backlog){
  48. listen(SOCKET_HANDLERTOFD(socket), backlog);
  49. return 0;
  50. }
  51. c11_socket_handler c11_socket_accept(c11_socket_handler socket, char* client_ip, unsigned short* client_port){
  52. struct sockaddr_in client_addr;
  53. socklen_t sockaddr_len = sizeof(client_addr);
  54. socket_fd client_socket = accept(SOCKET_HANDLERTOFD(socket), (struct sockaddr*)&client_addr, &sockaddr_len);
  55. if(client_ip != NULL){
  56. inet_ntop(AF_INET, &client_addr.sin_addr,client_ip,sizeof("255.255.255.255"));
  57. }
  58. if(client_port != NULL){
  59. *client_port = ntohs(client_addr.sin_port);
  60. }
  61. return SOCKET_FDTOHANDLER(client_socket);
  62. }
  63. int c11_socket_connect(c11_socket_handler socket, const char* server_ip, unsigned short server_port){
  64. struct sockaddr_in server_addr;
  65. server_addr.sin_family = AF_INET;
  66. server_addr.sin_port = htons(server_port);
  67. inet_pton(AF_INET, server_ip, &server_addr.sin_addr);
  68. if(connect(SOCKET_HANDLERTOFD(socket), (const struct sockaddr*)&server_addr, sizeof(server_addr)) == -1){
  69. return -1;
  70. }
  71. return 0;
  72. }
  73. int c11_socket_recv(c11_socket_handler socket, char* buffer, int maxsize){
  74. return recv(SOCKET_HANDLERTOFD(socket), buffer, maxsize,0);
  75. }
  76. int c11_socket_send(c11_socket_handler socket, const char* senddata, int datalen){
  77. return send(SOCKET_HANDLERTOFD(socket), senddata, datalen, 0);
  78. }
  79. int c11_socket_close(c11_socket_handler socket){
  80. #if defined (_WIN32) || defined (_WIN64)
  81. return closesocket(SOCKET_HANDLERTOFD(socket));
  82. #else
  83. return close(SOCKET_HANDLERTOFD(socket));
  84. #endif
  85. }
  86. int c11_socket_set_block(c11_socket_handler socket,int flag){
  87. #if defined (_WIN32) || defined (_WIN64)
  88. u_long mode = flag == 1 ? 0 : 1;
  89. return ioctlsocket(SOCKET_HANDLERTOFD(socket), FIONBIO, &mode);
  90. #else
  91. int flags = fcntl(SOCKET_HANDLERTOFD(socket), F_GETFL, 0);
  92. return fcntl(SOCKET_HANDLERTOFD(socket), F_SETFL, flags | O_NONBLOCK);
  93. #endif
  94. }
  95. c11_socket_handler c11_socket_invalid_socket_handler(){
  96. return (void*)(uintptr_t)(-1);
  97. }
  98. int c11_socket_get_last_error(){
  99. #if defined (_WIN32) || defined (_WIN64)
  100. return WSAGetLastError();
  101. #else
  102. return errno;
  103. #endif
  104. }
  105. #undef SOCKET_HANDLERTOFD
  106. #undef SOCKET_FDTOHANDLER
  107. #endif // PK_ENABLE_OS