$search
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 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 /* Create a socket using: 00067 * AF_INET - IPv4 internet protocol 00068 * SOCK_DGRAM - UDP type 00069 * protocol (0) - System chooses 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 // Initialize address data structure 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 // This set the socket to be non-blocking (NOT SURE I WANT THIS) - sme 00085 //fcntl(sock_handle, F_SETFL, O_NONBLOCK); 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 // Listen for handshake. Once received, break 00126 // listen loop. 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 // Send a reply handshake 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 } //udp_server 00160 } //industrial 00161