udpsocket.cpp 2.5 KB

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