Advertisement
Guest User

UDP_Socket

a guest
Jul 20th, 2014
43
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.88 KB | None | 0 0
  1. #include "UDP_Socket.h"
  2. #include <stdint.h>
  3. #include <string>
  4. #include <iostream>
  5.  
  6. UDP_Socket::UDP_Socket(void)
  7. {
  8.     timeout_set = false;
  9. }
  10.  
  11. UDP_Socket::UDP_Socket(std::string IP_address_param, uint16_t port_param) :
  12.     Socket(IP_address_param, port_param)
  13. {
  14.     timeout_set = false;
  15. }
  16.  
  17. UDP_Socket::~UDP_Socket(void)
  18. {
  19. }
  20.  
  21.  
  22. int UDP_Socket::create_socket()
  23. {
  24.     // Create a SOCKET for the server to listen for client connections
  25.     listen_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  26.  
  27.     // Check for errors to ensure that the socket is a valid socket.
  28.     if (listen_socket == INVALID_SOCKET) {
  29.         std::cerr << "Socket function failed with error: " << WSAGetLastError() << std::endl;
  30.         //WSACleanup();
  31.         return 1;
  32.     }
  33.  
  34.     return 0;
  35. }
  36.  
  37. int UDP_Socket::set_timeout(int s, int ms)
  38. {
  39.     //timeout.tv_sec = s;
  40.     //timeout.tv_usec = us;
  41.     timeout_set = true;
  42.  
  43.     time = 1000*s + ms;
  44.  
  45.     int result = setsockopt(listen_socket, SOL_SOCKET, SO_RCVTIMEO, (const char*) &time, sizeof(time));
  46.  
  47.     return result;
  48. }
  49.  
  50.  
  51. int UDP_Socket::bind_socket(std::string IP_address_param, uint16_t port_param)
  52. {
  53.     // The sockaddr_in structure specifies the address family,
  54.     // IP address, and port for the socket that is being bound.
  55.     service.sin_family = AF_INET;
  56.     service.sin_addr.s_addr = inet_addr(IP_address_param.c_str());
  57.     service.sin_port = htons(port_param);
  58.  
  59.     // Bind the socket.
  60.     int iResult = bind(listen_socket, (SOCKADDR *) &service, sizeof (service));
  61.  
  62.     if (iResult == SOCKET_ERROR) {
  63.         std::cerr << "Bind failed with error: " << WSAGetLastError() << std::endl;
  64.         closesocket(listen_socket);
  65.  
  66.         return 1;
  67.     }
  68.    
  69.     IP_address = IP_address_param;
  70.     port = port_param;
  71.     bound = true;
  72.  
  73.     return 0;
  74. }
  75.  
  76.  
  77. int UDP_Socket::bind_socket()
  78. {
  79.     // The sockaddr_in structure specifies the address family,
  80.     // IP address, and port for the socket that is being bound.
  81.     service.sin_family = AF_INET;
  82.     service.sin_addr.s_addr = inet_addr(IP_address.c_str());
  83.     service.sin_port = htons(port);
  84.  
  85.     // Bind the socket.
  86.     int iResult = bind(listen_socket, (SOCKADDR *) &service, sizeof (service));
  87.     if (iResult == SOCKET_ERROR) {
  88.         std::cerr << "Bind failed with error: " << WSAGetLastError() << std::endl;
  89.         closesocket(listen_socket);
  90.         //WSACleanup();
  91.         return 1;
  92.     }
  93.    
  94.     bound = true;
  95.     return 0;
  96. }
  97.  
  98.  
  99.  
  100. int UDP_Socket::receive_from(char* buff, int len, std::string &sender_address, uint16_t &sender_port)
  101. {
  102.     /*if (timeout_set)
  103.     {
  104.         fd_set fds;
  105.         int n;
  106.  
  107.         // Set up the file descriptor set.
  108.         FD_ZERO(&fds);
  109.         FD_SET(listen_socket, &fds) ;
  110.  
  111.         // Wait until timeout or data received.
  112.         n = select(listen_socket, &fds, NULL, NULL, &timeout) ;
  113.         if ( n == 0)
  114.         {
  115.             std::cerr << "Timeout at: " << *this << " socket in recieve_from function" << std::endl;
  116.             return -1;
  117.         }
  118.  
  119.         else if( n == -1 )
  120.         {
  121.             std::cerr << "Error at winsock2 select() function at " << *this << " socket in recieve_from function" << std::endl;
  122.             return -2;  
  123.         }
  124.     }*/
  125.  
  126.     sockaddr_in sender;
  127.     int sender_len = sizeof(sender);
  128.  
  129.     // http://msdn.microsoft.com/en-us/library/windows/desktop/ms740121%28v=vs.85%29.aspx
  130.     int return_value;
  131.     try
  132.     {
  133.         return_value = recvfrom(listen_socket, buff, len, 0, (sockaddr*) &sender, &sender_len);
  134.     } catch (...)
  135.     {
  136.         return return_value;
  137.     }
  138.    
  139.    
  140.    
  141.     //std::cout << "Last error: " << WSAGetLastError() << std::endl;
  142.  
  143.     char* address = inet_ntoa(sender.sin_addr);
  144.     sender_address = std::string(address);
  145.     sender_port = ntohs(sender.sin_port);
  146.  
  147.     return return_value;
  148. }
  149.  
  150.  
  151. int UDP_Socket::send_to(const char* data, int len, UDP_Socket addr)
  152. {
  153.     sockaddr_in target;
  154.     target.sin_family = AF_INET;
  155.     target.sin_addr.s_addr = inet_addr(addr.get_IP_address().c_str());
  156.     target.sin_port = htons(addr.get_port());
  157.     int result = sendto(listen_socket, data, len, 0, (SOCKADDR *) &target, sizeof(target));
  158.     return result;
  159. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement