server_tcp.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. /*
  2. * File: server_tcp.c
  3. * Author: Arthur Brandao
  4. *
  5. * Created on 14 novembre 2018
  6. */
  7. #include "error.h"
  8. #include "server.h"
  9. /* --- Fonctions privées --- */
  10. void server_bind_tcp(Server this, int port) {
  11. /* Declaration variable */
  12. int tmp;
  13. /* Bind */
  14. this->serv.sin_family = AF_INET;
  15. this->serv.sin_port = htons(port);
  16. this->serv.sin_addr.s_addr = htonl(INADDR_ANY);
  17. tmp = bind(this->socket, (struct sockaddr*) &this->serv, sizeof (struct sockaddr_in));
  18. if (tmp == ERR) {
  19. free(this);
  20. neterror(BIND_ERROR)
  21. }
  22. /* Listen */
  23. tmp = listen(this->socket, SOMAXCONN);
  24. if (tmp == ERR) {
  25. free(this);
  26. neterror(BIND_ERROR)
  27. }
  28. }
  29. void server_accept_tcp(Server this) {
  30. /* Accept */
  31. this->socket_client = accept(this->socket, NULL, NULL);
  32. if (this->socket_client == ERR) {
  33. free(this);
  34. syserror("Erreur lors de la demande de connexion ", 3)
  35. }
  36. }
  37. ssize_t server_receive_tcp(Server this, char* buf, size_t size) {
  38. int tmp;
  39. /* Lecture message */
  40. tmp = read(this->socket_client, buf, size);
  41. if (tmp == ERR) {
  42. free(this);
  43. syserror("Erreur lors de la reception ", 3)
  44. }
  45. return tmp;
  46. }
  47. void server_send_tcp(Server this, char* msg) {
  48. int tmp;
  49. /* Envoi message */
  50. tmp = write(this->socket_client, msg, strlen(msg) * sizeof (char));
  51. if (tmp == ERR) {
  52. free(this);
  53. syserror("Erreur lors de l'envoi ", 3)
  54. }
  55. }
  56. /* --- Fonctions publiques --- */
  57. Server server_create_tcp() {
  58. /* Declaration variable */
  59. Server this;
  60. int tmp, option;
  61. /* Creation socket */
  62. this = malloc(sizeof (struct server));
  63. this->socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  64. if (this->socket == ERR) {
  65. free(this);
  66. neterror(SOCKET_ERROR)
  67. }
  68. this->addr = sizeof (struct sockaddr_in);
  69. memset(&this->serv, 0, sizeof (struct sockaddr_in));
  70. /* Indique la possibilité de réutiliser la socket même si elle est en TIME_WAIT */
  71. option = 1;
  72. tmp = setsockopt(this->socket, SOL_SOCKET, SO_REUSEADDR, &option, sizeof (option));
  73. if (tmp == -1) {
  74. free(this);
  75. neterror(SOCKET_ERROR)
  76. }
  77. /* Lien fonctions */
  78. this->server_bind = server_bind_tcp;
  79. this->server_receive = server_receive_tcp;
  80. this->server_send = server_send_tcp;
  81. this->server_accept = server_accept_tcp;
  82. /* Type de serveur */
  83. this->type = SERV_TCP;
  84. /* Retour */
  85. return this;
  86. }
  87. void server_close_client(Server this) {
  88. /* Declaration variable */
  89. int tmp;
  90. /* Que pour TCP */
  91. if (this->type != SERV_TCP) {
  92. return;
  93. }
  94. /* Ferme */
  95. tmp = close(this->socket_client);
  96. if (tmp == ERR) {
  97. free(this);
  98. syserror("Erreur lors de la fermeture de la socket ", 3)
  99. }
  100. }