Advertisement
Guest User

Untitled

a guest
Mar 21st, 2019
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.57 KB | None | 0 0
  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <netdb.h>
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <unistd.h>
  7. #include <stdlib.h>
  8.  
  9. #include "err.h"
  10.  
  11. #define BUFFER_SIZE 1000
  12.  
  13. int main(int argc, char *argv[]) {
  14. int sock;
  15. struct addrinfo addr_hints;
  16. struct addrinfo *addr_result;
  17.  
  18. int i, flags, sflags;
  19. char buffer[BUFFER_SIZE];
  20. size_t len;
  21. ssize_t snd_len, rcv_len;
  22. struct sockaddr_in my_address;
  23. struct sockaddr_in srvr_address;
  24. socklen_t rcva_len;
  25.  
  26. if (argc < 5) {
  27. fatal("Usage: %s host port message ...\n", argv[0]);
  28. }
  29.  
  30. int n = atoi(argv[3]);
  31. int k = atoi(argv[4]);
  32. // 'converting' host/port in string to struct addrinfo
  33. (void) memset(&addr_hints, 0, sizeof(struct addrinfo));
  34. addr_hints.ai_family = AF_INET; // IPv4
  35. addr_hints.ai_socktype = SOCK_DGRAM;
  36. addr_hints.ai_protocol = IPPROTO_UDP;
  37. addr_hints.ai_flags = 0;
  38. addr_hints.ai_addrlen = 0;
  39. addr_hints.ai_addr = NULL;
  40. addr_hints.ai_canonname = NULL;
  41. addr_hints.ai_next = NULL;
  42. if (getaddrinfo(argv[1], NULL, &addr_hints, &addr_result) != 0) {
  43. syserr("getaddrinfo");
  44. }
  45.  
  46. my_address.sin_family = AF_INET; // IPv4
  47. my_address.sin_addr.s_addr =
  48. ((struct sockaddr_in*) (addr_result->ai_addr))->sin_addr.s_addr; // address IP
  49. my_address.sin_port = htons((uint16_t) atoi(argv[2])); // port from the command line
  50.  
  51. freeaddrinfo(addr_result);
  52.  
  53. sock = socket(PF_INET, SOCK_DGRAM, 0);
  54. if (sock < 0)
  55. syserr("socket");
  56.  
  57. for (i = 0; i < n; i++) {
  58. len = k;
  59. //len = strnlen(argv[i], BUFFER_SIZE);
  60. if (len == BUFFER_SIZE) {
  61. (void) fprintf(stderr, "ignoring long parameter %d\n", i);
  62. continue;
  63. }
  64. char text[BUFFER_SIZE];
  65. (void)memset(text, '*', len);
  66. (void) printf("sending to socket: %s\n", "cos");
  67. sflags = 0;
  68. rcva_len = (socklen_t) sizeof(my_address);
  69. snd_len = sendto(sock, text, len, sflags,
  70. (struct sockaddr *) &my_address, rcva_len);
  71. if (snd_len != (ssize_t) len) {
  72. syserr("partial / failed write");
  73. }
  74.  
  75. (void) memset(buffer, 0, sizeof(buffer));
  76. flags = 0;
  77. len = (size_t) sizeof(buffer) - 1;
  78. rcva_len = (socklen_t) sizeof(srvr_address);
  79. rcv_len = recvfrom(sock, buffer, len, flags,
  80. (struct sockaddr *) &srvr_address, &rcva_len);
  81.  
  82. if (rcv_len < 0) {
  83. syserr("read");
  84. }
  85. (void) printf("read from socket: %zd bytes: %s\n", rcv_len, buffer);
  86. }
  87.  
  88. if (close(sock) == -1) { //very rare errors can occur here, but then
  89. syserr("close"); //it's healthy to do the check
  90. }
  91.  
  92. return 0;
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement