server_tcp.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. /*
  2. * File: server_tcp.c
  3. * Author: Arthur Brandao
  4. *
  5. * Created on 14 novembre 2018
  6. */
  7. #include <stdlib.h>
  8. #include <stdio.h>
  9. #include <unistd.h>
  10. #include <string.h>
  11. #include "error.h"
  12. #include "server.h"
  13. /* --- Extern --- */
  14. extern int serrno;
  15. /* --- Fonctions privées --- */
  16. boolean server_bind_tcp(Server this, int port) {
  17. /* Declaration variable */
  18. int tmp;
  19. /* Bind */
  20. this->serv.sin_family = AF_INET;
  21. this->serv.sin_port = htons(port);
  22. this->serv.sin_addr.s_addr = htonl(INADDR_ANY);
  23. tmp = bind(this->socket, (struct sockaddr*) &this->serv, sizeof (struct sockaddr_in));
  24. if (tmp == ERR) {
  25. free(this);
  26. serrno = SEBIND;
  27. addperror("Impossible de bind la socket");
  28. return false;
  29. }
  30. /* Listen */
  31. tmp = listen(this->socket, SOMAXCONN);
  32. if (tmp == ERR) {
  33. free(this);
  34. serrno = SEBIND;
  35. addperror("Impossible d'ecouter");
  36. return false;
  37. }
  38. return true;
  39. }
  40. boolean server_accept_tcp(Server this) {
  41. /* Accept */
  42. this->socket_client = accept(this->socket, NULL, NULL);
  43. if (this->socket_client == ERR) {
  44. serrno = SEACCEPT;
  45. addperror("Impossible d'accepter");
  46. return false;
  47. }
  48. return true;
  49. }
  50. ssize_t server_receive_tcp(Server this, char* buf, size_t size) {
  51. int tmp;
  52. /* Lecture message */
  53. memset(buf, 0, size);
  54. tmp = read(this->socket_client, buf, size);
  55. if (tmp == ERR) {
  56. serrno = SERECEIVE;
  57. addperror("Impossible de récupèrer les données");
  58. return ERR;
  59. }
  60. return tmp;
  61. }
  62. boolean server_send_tcp(Server this, char* msg) {
  63. int tmp;
  64. /* Envoi message */
  65. tmp = write(this->socket_client, msg, strlen(msg) * sizeof (char));
  66. if (tmp == ERR) {
  67. serrno = SESEND;
  68. addperror("Impossible d'envoyer les données");
  69. return false;
  70. }
  71. return true;
  72. }
  73. /* --- Fonctions publiques --- */
  74. Server server_create_tcp() {
  75. /* Declaration variable */
  76. Server this;
  77. int tmp, option;
  78. /* Creation socket */
  79. this = malloc(sizeof (struct server));
  80. this->socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  81. if (this->socket == ERR) {
  82. free(this);
  83. serrno = SESOCKET;
  84. addperror("Impossible de créer la socket");
  85. return NULL;
  86. }
  87. this->addr = sizeof (struct sockaddr_in);
  88. memset(&this->serv, 0, sizeof (struct sockaddr_in));
  89. /* Indique la possibilité de réutiliser la socket même si elle est en TIME_WAIT */
  90. option = 1;
  91. tmp = setsockopt(this->socket, SOL_SOCKET, SO_REUSEADDR, &option, sizeof (option));
  92. if (tmp == -1) {
  93. free(this);
  94. serrno = SESOCKET;
  95. addperror("Impossible de modifier les options de la socket");
  96. return NULL;
  97. }
  98. /* Lien fonctions */
  99. this->server_bind = server_bind_tcp;
  100. this->server_receive = server_receive_tcp;
  101. this->server_send = server_send_tcp;
  102. this->server_accept = server_accept_tcp;
  103. /* Type de serveur */
  104. this->type = SERV_TCP;
  105. /* Retour */
  106. return this;
  107. }
  108. boolean server_close_client(Server this) {
  109. /* Que pour TCP */
  110. if (this->type != SERV_TCP) {
  111. serrno = SETYPE;
  112. adderror("Type de la socket incorrect");
  113. return false;
  114. }
  115. /* Ferme */
  116. if (close(this->socket_client) == ERR) {
  117. serrno = SECLOSE;
  118. addperror("Impossible de fermer la socket");
  119. return false;
  120. }
  121. return true;
  122. }