udpsocket_posix.cpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #include "udpsocket.hpp"
  2. udpsocket::udpsocket(int port) : m_port(port){
  3. if ((s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
  4. throw std::logic_error(std::string("Socket creation failed: ") + strerror(errno));
  5. }
  6. std::memset((char*)&addr, 0, sizeof(addr));
  7. addr.sin_family = AF_INET;
  8. addr.sin_addr.s_addr = htonl(INADDR_ANY);
  9. addr.sin_port = htons(this->port());
  10. if (bind(s, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
  11. throw std::logic_error(std::string("Socket binding failed: ") + strerror(errno));
  12. }
  13. }
  14. udpsocket::udpsocket(udpsocket&& o) : addr(o.addr),s(o.s),m_port(o.m_port) {
  15. o.s = 0;
  16. o.m_port = 0;
  17. }
  18. udpsocket& udpsocket::operator=(udpsocket&& o){
  19. addr = o.addr;
  20. s = o.s;
  21. m_port = o.m_port;
  22. o.s = 0;
  23. o.m_port = 0;
  24. return *this;
  25. }
  26. void udpsocket::write(const std::string& msg, const std::string& dest, int port)const{
  27. std::vector<char> _msg(msg.begin(), msg.end());
  28. write(_msg, dest, port);
  29. }
  30. void udpsocket::write(const std::vector<char>& msg, const std::string& dest, int port)const{
  31. hostent *server_host;
  32. errno = 0;
  33. server_host = gethostbyname(dest.c_str());
  34. if(errno){
  35. throw std::logic_error("Could not resolve hostname " + dest + ": " + strerror(errno));
  36. }
  37. /* configure the server address */
  38. struct sockaddr_in server_addr;
  39. server_addr.sin_family = AF_INET; // IPv4
  40. memcpy(&server_addr.sin_addr, server_host->h_addr,
  41. sizeof(struct in_addr)); server_addr.sin_port = htons(port);
  42. /* send a message */
  43. if(sendto(s, msg.data(), msg.size(), 0,(const sockaddr*)&server_addr, sizeof(server_addr)) < 0){
  44. throw std::logic_error(std::string("Could not send packet: ") + strerror(errno));
  45. }
  46. }
  47. std::vector<char> udpsocket::receive()const{
  48. std::vector<char> ret(1024);
  49. int l;
  50. if ((l = read(s, ret.data(), 1024)) <= 0) {
  51. throw std::logic_error(std::string("Could not receive packet: ") + strerror(errno));
  52. }
  53. ret.resize(l);
  54. return ret;
  55. }
  56. void udpsocket::close(){
  57. shutdown(s, 2);
  58. }
  59. int udpsocket::port()const {
  60. return this->m_port;
  61. }