Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
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
00063
00064
00065
00066
00067 rc = SOCKET(AF_INET, SOCK_DGRAM, 0);
00068 if (this->SOCKET_FAIL != rc)
00069 {
00070 this->setSockHandle(rc);
00071
00072
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;
00097 int bytesRcvd = 0;
00098
00099 if (!this->isConnected())
00100 {
00101 this->setConnected(false);
00102 send.load((void*)&sendHS, sizeof(sendHS));
00103
00104
00105
00106 const int sendLen = send.getBufferSize();
00107 char localBuffer[sendLen];
00108 send.unload(localBuffer, sendLen);
00109
00110 do
00111 {
00112 ByteArray recv;
00113 recvHS = 0;
00114 LOG_DEBUG("UDP client sending handshake");
00115 this->rawSendBytes(localBuffer, sendLen);
00116 if (this->isReadyReceive(timeout))
00117 {
00118 bytesRcvd = this->rawReceiveBytes(this->buffer_, 0);
00119 LOG_DEBUG("UDP client received possible handshake");
00120 recv.init(&this->buffer_[0], bytesRcvd);
00121 recv.unload((void*)&recvHS, sizeof(recvHS));
00122 }
00123 }
00124 while(recvHS != sendHS);
00125 LOG_INFO("UDP client connected");
00126 rtn = true;
00127 this->setConnected(true);
00128
00129 }
00130 else
00131 {
00132 rtn = true;
00133 LOG_WARN("Tried to connect when socket already in connected state");
00134 }
00135
00136 return rtn;
00137 }
00138 }
00139 }
00140