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
00032 #ifdef ROS
00033 #include "simple_message/socket/udp_server.h"
00034 #include "simple_message/log_wrapper.h"
00035 #endif
00036
00037 #ifdef MOTOPLUS
00038 #include "udp_server.h"
00039 #include "log_wrapper.h"
00040 #endif
00041
00042 using namespace industrial::byte_array;
00043
00044 namespace industrial
00045 {
00046 namespace udp_server
00047 {
00048
00049 UdpServer::UdpServer()
00050 {
00051 this->setConnected(false);
00052 }
00053
00054 UdpServer::~UdpServer()
00055 {
00056 }
00057
00058
00059
00060 bool UdpServer::init(int port_num)
00061 {
00062 int rc = this->SOCKET_FAIL;
00063 bool rtn;
00064 SOCKLEN_T addrSize = 0;
00065
00066
00067
00068
00069
00070
00071 rc = SOCKET(AF_INET, SOCK_DGRAM, 0);
00072 if (this->SOCKET_FAIL != rc)
00073 {
00074 this->setSockHandle(rc);
00075 LOG_DEBUG("Socket created, rc: %d", rc);
00076 LOG_DEBUG("Socket handle: %d", this->getSockHandle());
00077
00078
00079 memset(&this->sockaddr_, 0, sizeof(this->sockaddr_));
00080 this->sockaddr_.sin_family = AF_INET;
00081 this->sockaddr_.sin_addr.s_addr = INADDR_ANY;
00082 this->sockaddr_.sin_port = HTONS(port_num);
00083
00084
00085
00086
00087 addrSize = sizeof(this->sockaddr_);
00088 rc = BIND(this->getSockHandle(), (sockaddr *)&(this->sockaddr_), addrSize);
00089
00090 if (this->SOCKET_FAIL != rc)
00091 {
00092 rtn = true;
00093 LOG_INFO("Server socket successfully initialized");
00094 }
00095 else
00096 {
00097 LOG_ERROR("Failed to bind socket, rc: %d", rc);
00098 CLOSE(this->getSockHandle());
00099 rtn = false;
00100 }
00101 }
00102 else
00103 {
00104 LOG_ERROR("Failed to create socket, rc: %d", rc);
00105 rtn = false;
00106 }
00107 return rtn;
00108 }
00109
00110
00111 bool UdpServer::makeConnect()
00112 {
00113 ByteArray send;
00114 char sendHS = this->CONNECT_HANDSHAKE;
00115 char recvHS = 0;
00116 int bytesRcvd = 0;
00117 bool rtn = false;
00118
00119 send.load((void*)&sendHS, sizeof(sendHS));
00120
00121 if (!this->isConnected())
00122 {
00123 this->setConnected(false);
00124
00125
00126
00127 do
00128 {
00129 ByteArray recv;
00130 recvHS = 0;
00131 bytesRcvd = this->rawReceiveBytes(this->buffer_, 0);
00132
00133 if (bytesRcvd > 0)
00134 {
00135 LOG_DEBUG("UDP server received %d bytes while waiting for handshake", bytesRcvd);
00136 recv.init(&this->buffer_[0], bytesRcvd);
00137 recv.unload((void*)&recvHS, sizeof(recvHS));
00138 }
00139
00140 }
00141 while(recvHS != sendHS);
00142
00143
00144 this->rawSendBytes(send.getRawDataPtr(), send.getBufferSize());
00145 this->setConnected(true);
00146 rtn = true;
00147
00148 }
00149 else
00150 {
00151 LOG_WARN("Tried to connect when socket already in connected state");
00152 rtn = true;
00153 }
00154
00155 return rtn;
00156 }
00157
00158
00159 }
00160 }
00161