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 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 }
00133 }
00134