udpsocket.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #include <arpa/inet.h>
  2. #include <iostream>
  3. #include <stdexcept>
  4. #include <netdb.h> //printf
  5. #include <stdlib.h> //exit(0);
  6. #include <cstring> //memset
  7. #include <sys/socket.h>
  8. #include <unistd.h>
  9. #include <netinet/in.h>
  10. #include <sys/types.h>
  11. #include <vector>
  12. #define SERVER "127.0.0.1"
  13. #define BUFLEN 1024 // Max length of buffer
  14. #define PORT 8888 // The port on which to send data
  15. class udpsocket {
  16. struct sockaddr_in addr;
  17. int s, slen = sizeof(addr);
  18. public:
  19. udpsocket(int port);
  20. udpsocket(const udpsocket&) = delete;
  21. udpsocket& operator=(const udpsocket&) = delete;
  22. udpsocket(udpsocket&&);
  23. udpsocket& operator=(udpsocket&&);
  24. void write(const std::string&,const std::string& dest, int port);
  25. void write(const std::vector<char>&,const std::string& dest, int port);
  26. std::vector<char> receive();
  27. void close();
  28. };
  29. udpsocket::udpsocket(int port) {
  30. if ((s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
  31. throw std::logic_error(std::string("Socket creation failed: ") + strerror(errno));
  32. }
  33. std::memset((char*)&addr, 0, sizeof(addr));
  34. addr.sin_family = AF_INET;
  35. addr.sin_addr.s_addr = htonl(INADDR_ANY);
  36. addr.sin_port = htons(port);
  37. if (bind(s, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
  38. throw std::logic_error(std::string("Socket binding failed: ") + strerror(errno));
  39. }
  40. }
  41. udpsocket::udpsocket(udpsocket&& o) : addr(o.addr),s(o.s) {
  42. o.s = 0;
  43. }
  44. udpsocket& udpsocket::operator=(udpsocket&& o){
  45. addr = o.addr;
  46. s = o.s;
  47. o.s = 0;
  48. return *this;
  49. }
  50. void udpsocket::write(const std::string& msg, const std::string& dest, int port){
  51. std::vector<char> _msg(msg.begin(), msg.end());
  52. write(_msg, dest, port);
  53. }
  54. void udpsocket::write(const std::vector<char>& msg, const std::string& dest, int port){
  55. hostent *server_host;
  56. errno = 0;
  57. server_host = gethostbyname(dest.c_str());
  58. if(errno){
  59. throw std::logic_error("Could not resolve hostname " + dest + ": " + strerror(errno));
  60. }
  61. /* configure the server address */
  62. struct sockaddr_in server_addr;
  63. server_addr.sin_family = AF_INET; // IPv4
  64. memcpy(&server_addr.sin_addr, server_host->h_addr,
  65. sizeof(struct in_addr)); server_addr.sin_port = htons(port);
  66. /* send a message */
  67. while(true)
  68. if(sendto(s, msg.data(), msg.size(), 0,(const sockaddr*)&server_addr, sizeof(server_addr)) < 0){
  69. throw std::logic_error(std::string("Could not send packet: ") + strerror(errno));
  70. }
  71. }
  72. std::vector<char> udpsocket::receive(){
  73. std::vector<char> ret(1024);
  74. if (read(s, ret.data(), 1024) <= 0) {
  75. throw std::logic_error(std::string("Could not receive packet: ") + strerror(errno));
  76. }
  77. return ret;
  78. }
  79. void udpsocket::close(){
  80. shutdown(s, 2);
  81. }
  82. void die(const std::string& s) {
  83. perror(s.c_str());
  84. exit(1);
  85. }
  86. int main() {
  87. udpsocket sock(5566);
  88. std::vector<char> d(512,'a');
  89. while(true)
  90. sock.write(d.data(), "8.8.8.8" ,5555);
  91. std::cin.get();
  92. return 0;
  93. }