server_udp.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. /*
  2. * File: server_udp.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. void server_bind(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. }
  29. }
  30. ssize_t server_receive_udp(Server this, char* buf, size_t size) {
  31. /* Declaration variable */
  32. int tmp;
  33. /* Reception */
  34. memset(buf, 0, size);
  35. tmp = recvfrom(this->socket, buf, size, 0, (struct sockaddr*) &this->client, &this->addr);
  36. if (tmp == ERR) {
  37. serrno = SERECEIVE;
  38. addperror("Impossible de récupèrer les données");
  39. return ERR;
  40. }
  41. /* Retour */
  42. return tmp;
  43. }
  44. void server_send_udp(Server this, char* msg) {
  45. /* Declaration variable */
  46. int tmp;
  47. /* Envoi */
  48. tmp = sendto(this->socket, msg, strlen(msg) * sizeof (char), 0, (struct sockaddr*) &this->client, sizeof (struct sockaddr_in));
  49. if (tmp == ERR) {
  50. serrno = SESEND;
  51. addperror("Impossible d'envoyer les données");
  52. }
  53. }
  54. /* --- Fonctions publiques --- */
  55. Server server_create_udp() {
  56. /* Declaration variable */
  57. Server this;
  58. /* Creation socket */
  59. this = malloc(sizeof (struct server));
  60. this->socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  61. if (this->socket == ERR) {
  62. free(this);
  63. serrno = SESOCKET;
  64. addperror("Impossible de créer la socket");
  65. return NULL;
  66. }
  67. this->addr = sizeof (struct sockaddr_in);
  68. memset(&this->serv, 0, sizeof (struct sockaddr_in));
  69. /* Lien fonctions */
  70. this->server_bind = server_bind;
  71. this->server_receive = server_receive_udp;
  72. this->server_send = server_send_udp;
  73. this->server_accept = NULL;
  74. /* Type de serveur */
  75. this->type = SERV_UDP;
  76. /* Retour */
  77. return this;
  78. }
  79. void server_close(Server this) {
  80. /* Ferme */
  81. if (close(this->socket) == ERR) {
  82. serrno = SECLOSE;
  83. addperror("Impossible de fermer la socket");
  84. }
  85. /* Supprime */
  86. free(this);
  87. }