udp_client.cpp
Go to the documentation of this file.
00001 /*
00002  * Software License Agreement (BSD License)
00003  *
00004  * Copyright (c) 2011, Yaskawa America, Inc.
00005  * All rights reserved.
00006  *
00007  * Redistribution and use in source and binary forms, with or without
00008  * modification, are permitted provided that the following conditions are met:
00009  *
00010  *       * Redistributions of source code must retain the above copyright
00011  *       notice, this list of conditions and the following disclaimer.
00012  *       * Redistributions in binary form must reproduce the above copyright
00013  *       notice, this list of conditions and the following disclaimer in the
00014  *       documentation and/or other materials provided with the distribution.
00015  *       * Neither the name of the Yaskawa America, Inc., nor the names
00016  *       of its contributors may be used to endorse or promote products derived
00017  *       from this software without specific prior written permission.
00018  *
00019  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00020  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00021  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00022  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
00023  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00024  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00025  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00026  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00027  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00028  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00029  * POSSIBILITY OF SUCH DAMAGE.
00030  */
00031 #ifndef FLATHEADERS
00032 #include "simple_message/socket/udp_client.h"
00033 #include "simple_message/log_wrapper.h"
00034 #else
00035 #include "udp_client.h"
00036 #include "log_wrapper.h"
00037 #endif
00038 
00039 
00040 using namespace industrial::byte_array;
00041 using namespace industrial::shared_types;
00042 
00043 namespace industrial
00044 {
00045 namespace udp_client
00046 {
00047 
00048 UdpClient::UdpClient()
00049 {
00050 }
00051 
00052 UdpClient::~UdpClient()
00053 {
00054 }
00055 
00056 bool UdpClient::init(char *buff, int port_num)
00057 {
00058 
00059   int rc;
00060   bool rtn;
00061 
00062   /* Create a socket using:
00063    * AF_INET - IPv4 internet protocol
00064    * SOCK_DGRAM - UDP type
00065    * protocol (0) - System chooses
00066    */
00067   rc = SOCKET(AF_INET, SOCK_DGRAM, 0);
00068   if (this->SOCKET_FAIL != rc)
00069   {
00070     this->setSockHandle(rc);
00071 
00072     // Initialize address data structure
00073     memset(&this->sockaddr_, 0, sizeof(this->sockaddr_));
00074     this->sockaddr_.sin_family = AF_INET;
00075     this->sockaddr_.sin_addr.s_addr = INET_ADDR(buff);
00076     this->sockaddr_.sin_port = HTONS(port_num);
00077 
00078     rtn = true;
00079 
00080   }
00081   else
00082   {
00083     LOG_ERROR("Failed to create socket, rc: %d", rc);
00084     rtn = false;
00085   }
00086   return rtn;
00087 }
00088 
00089 
00090 bool UdpClient::makeConnect()
00091 {
00092   ByteArray send;
00093   char sendHS = this->CONNECT_HANDSHAKE;
00094   char recvHS = 0;
00095   bool rtn = false;
00096   const int timeout = 1000;  // Time (ms) between handshake sends
00097   int bytesRcvd = 0;
00098   
00099   if (!this->isConnected())
00100   {
00101     this->setConnected(false);
00102     send.load((void*)&sendHS, sizeof(sendHS));
00103   
00104     do
00105     {
00106       ByteArray recv;
00107       recvHS = 0;
00108       LOG_DEBUG("UDP client sending handshake");
00109       this->rawSendBytes(send.getRawDataPtr(), send.getBufferSize());
00110       if (this->isReadyReceive(timeout))
00111       {
00112         bytesRcvd = this->rawReceiveBytes(this->buffer_, 0);
00113         LOG_DEBUG("UDP client received possible handshake");    
00114         recv.init(&this->buffer_[0], bytesRcvd);
00115         recv.unload((void*)&recvHS, sizeof(recvHS));
00116       }
00117     }
00118     while(recvHS != sendHS);
00119     LOG_INFO("UDP client connected");
00120     rtn = true;
00121     this->setConnected(true);
00122     
00123   }
00124   else
00125   {
00126     rtn = true;
00127     LOG_WARN("Tried to connect when socket already in connected state");
00128   }
00129 
00130   return rtn;
00131 }
00132 } //udp_client
00133 } //industrial
00134 


simple_message
Author(s): Shaun Edwards
autogenerated on Sat Jun 8 2019 20:43:23