From 8f0b4d859444e428302a6b8ab53dae8af368aff1 Mon Sep 17 00:00:00 2001 From: miha_vitorovic Date: Fri, 7 Jan 2011 14:42:00 +0100 Subject: [PATCH] Using osiSockAddress parameter by reference wherever possible. --- .cproject | 5 +- pvAccessApp/remote/blockingTCP.h | 6 +- pvAccessApp/remote/blockingTCPConnector.cpp | 20 +++--- pvAccessApp/remote/blockingUDP.h | 20 +++--- pvAccessApp/remote/blockingUDPConnector.cpp | 6 +- pvAccessApp/remote/blockingUDPTransport.cpp | 72 ++++++++++++--------- pvAccessApp/remote/channelSearchManager.h | 2 +- pvAccessApp/remote/remote.h | 4 +- pvAccessApp/server/responseHandlers.cpp | 2 +- testApp/remote/testBeaconEmitter.cpp | 2 +- testApp/remote/testBeaconHandler.cpp | 2 +- testApp/remote/testBlockingTCPClnt.cpp | 2 +- testApp/remote/testBlockingUDPClnt.cpp | 12 ++-- testApp/remote/testBlockingUDPSrv.cpp | 2 +- 14 files changed, 86 insertions(+), 71 deletions(-) diff --git a/.cproject b/.cproject index 0e2a39f..e91f269 100644 --- a/.cproject +++ b/.cproject @@ -307,13 +307,15 @@ make + all true true - true + false make + clean true true @@ -321,7 +323,6 @@ make - uninstall true true diff --git a/pvAccessApp/remote/blockingTCP.h b/pvAccessApp/remote/blockingTCP.h index 5e4a20d..d7302e3 100644 --- a/pvAccessApp/remote/blockingTCP.h +++ b/pvAccessApp/remote/blockingTCP.h @@ -117,7 +117,7 @@ namespace epics { _verified = true; } - virtual void setRecipient(const osiSockAddr* sendTo) { + virtual void setRecipient(const osiSockAddr& sendTo) { // noop } @@ -492,7 +492,7 @@ namespace epics { virtual ~BlockingTCPConnector(); virtual Transport* connect(TransportClient* client, - ResponseHandler* responseHandler, osiSockAddr* address, + ResponseHandler* responseHandler, osiSockAddr& address, short transportRevision, int16 priority); private: /** @@ -528,7 +528,7 @@ namespace epics { * @return the SOCKET * @throws IOException */ - SOCKET tryConnect(osiSockAddr* address, int tries); + SOCKET tryConnect(osiSockAddr& address, int tries); }; diff --git a/pvAccessApp/remote/blockingTCPConnector.cpp b/pvAccessApp/remote/blockingTCPConnector.cpp index 0fd7687..4a066b6 100644 --- a/pvAccessApp/remote/blockingTCPConnector.cpp +++ b/pvAccessApp/remote/blockingTCPConnector.cpp @@ -32,13 +32,13 @@ namespace epics { delete _namedLocker; } - SOCKET BlockingTCPConnector::tryConnect(osiSockAddr* address, int tries) { + SOCKET BlockingTCPConnector::tryConnect(osiSockAddr& address, int tries) { for(int tryCount = 0; tryCount0) epicsThreadSleep(0.1); char strBuffer[64]; - ipAddrToA(&address->ia, strBuffer, sizeof(strBuffer)); + ipAddrToA(&address.ia, strBuffer, sizeof(strBuffer)); errlogSevPrintf(errlogInfo, "Opening socket to CA server %s, attempt %d.", @@ -53,7 +53,7 @@ namespace epics { strBuffer); } else { - if(::connect(socket, &address->sa, sizeof(sockaddr))==0) + if(::connect(socket, &address.sa, sizeof(sockaddr))==0) return socket; else { epicsSocketConvertErrnoToString(strBuffer, @@ -67,19 +67,19 @@ namespace epics { } Transport* BlockingTCPConnector::connect(TransportClient* client, - ResponseHandler* responseHandler, osiSockAddr* address, + ResponseHandler* responseHandler, osiSockAddr& address, short transportRevision, int16 priority) { SOCKET socket = INVALID_SOCKET; char ipAddrStr[64]; - ipAddrToA(&address->ia, ipAddrStr, sizeof(ipAddrStr)); + ipAddrToA(&address.ia, ipAddrStr, sizeof(ipAddrStr)); // first try to check cache w/o named lock... BlockingClientTCPTransport * transport = (BlockingClientTCPTransport*)(_context->getTransportRegistry()->get( - "TCP", address, priority)); + "TCP", &address, priority)); if(transport!=NULL) { errlogSevPrintf(errlogInfo, "Reusing existing connection to CA server: %s", @@ -88,13 +88,13 @@ namespace epics { } bool lockAcquired = _namedLocker->acquireSynchronizationObject( - address, LOCK_TIMEOUT); + &address, LOCK_TIMEOUT); if(lockAcquired) { try { // ... transport created during waiting in lock transport = (BlockingClientTCPTransport*)(_context->getTransportRegistry()->get( - "TCP", address, priority)); + "TCP", &address, priority)); if(transport!=NULL) { errlogSevPrintf(errlogInfo, "Reusing existing connection to CA server: %s", @@ -156,10 +156,10 @@ namespace epics { } catch(...) { // close socket, if open if(socket!=INVALID_SOCKET) epicsSocketDestroy(socket); - _namedLocker->releaseSynchronizationObject(address); + _namedLocker->releaseSynchronizationObject(&address); throw; } - _namedLocker->releaseSynchronizationObject(address); + _namedLocker->releaseSynchronizationObject(&address); } else { ostringstream temp; diff --git a/pvAccessApp/remote/blockingUDP.h b/pvAccessApp/remote/blockingUDP.h index 785f327..43b1b6f 100644 --- a/pvAccessApp/remote/blockingUDP.h +++ b/pvAccessApp/remote/blockingUDP.h @@ -32,7 +32,7 @@ namespace epics { public TransportSendControl { public: BlockingUDPTransport(ResponseHandler* responseHandler, - SOCKET channel, osiSockAddr* bindAddress, + SOCKET channel, osiSockAddr& bindAddress, InetAddrVector* sendAddresses, short remoteTransportRevision); @@ -107,8 +107,10 @@ namespace epics { // noop since all UDP requests are sent immediately } - virtual void setRecipient(const osiSockAddr* sendTo) { - _sendTo = sendTo; + virtual void setRecipient(const osiSockAddr& sendTo) { + if(_sendTo!=NULL) delete _sendTo; + _sendTo = new osiSockAddr; + memcpy(_sendTo, &sendTo, sizeof(osiSockAddr)); } virtual void flushSerializeBuffer() { @@ -135,7 +137,9 @@ namespace epics { return _ignoredAddresses; } - bool send(ByteBuffer* buffer, const osiSockAddr* address = NULL); + bool send(ByteBuffer* buffer, const osiSockAddr& address); + + bool send(ByteBuffer* buffer); /** * Get list of send addresses. @@ -149,7 +153,7 @@ namespace epics { * Get bind address. * @return bind address. */ - osiSockAddr* getBindAddress() { + const osiSockAddr* getBindAddress() const { return _bindAddress; } @@ -177,7 +181,7 @@ namespace epics { private: static void threadRunner(void* param); - bool processBuffer(osiSockAddr* fromAddress, + bool processBuffer(osiSockAddr& fromAddress, epics::pvData::ByteBuffer* receiveBuffer); // Context only used for logging in this class @@ -207,7 +211,7 @@ namespace epics { */ InetAddrVector* _ignoredAddresses; - const osiSockAddr* _sendTo; + osiSockAddr* _sendTo; /** * Receive buffer. @@ -259,7 +263,7 @@ namespace epics { * NOTE: transport client is ignored for broadcast (UDP). */ virtual Transport* connect(TransportClient* client, - ResponseHandler* responseHandler, osiSockAddr* bindAddress, + ResponseHandler* responseHandler, osiSockAddr& bindAddress, short transportRevision, int16 priority); private: diff --git a/pvAccessApp/remote/blockingUDPConnector.cpp b/pvAccessApp/remote/blockingUDPConnector.cpp index 002220b..3e97a93 100644 --- a/pvAccessApp/remote/blockingUDPConnector.cpp +++ b/pvAccessApp/remote/blockingUDPConnector.cpp @@ -24,10 +24,10 @@ namespace epics { namespace pvAccess { Transport* BlockingUDPConnector::connect(TransportClient* client, - ResponseHandler* responseHandler, osiSockAddr* bindAddress, + ResponseHandler* responseHandler, osiSockAddr& bindAddress, short transportRevision, int16 priority) { errlogSevPrintf(errlogInfo, "Creating datagram socket to: %s", - inetAddressToString(bindAddress).c_str()); + inetAddressToString(&bindAddress).c_str()); SOCKET socket = epicsSocketCreate(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if(socket==INVALID_SOCKET) { @@ -45,7 +45,7 @@ namespace epics { * because of an early setsockopt call failing. */ - int retval = ::bind(socket, (sockaddr*)&(bindAddress->sa), + int retval = ::bind(socket, (sockaddr*)&(bindAddress.sa), sizeof(sockaddr)); if(retval<0) { errlogSevPrintf(errlogMajor, "Error binding socket: %s", diff --git a/pvAccessApp/remote/blockingUDPTransport.cpp b/pvAccessApp/remote/blockingUDPTransport.cpp index 9a24c71..3f53a8a 100644 --- a/pvAccessApp/remote/blockingUDPTransport.cpp +++ b/pvAccessApp/remote/blockingUDPTransport.cpp @@ -34,21 +34,28 @@ namespace epics { BlockingUDPTransport::BlockingUDPTransport( ResponseHandler* responseHandler, SOCKET channel, - osiSockAddr* bindAddress, InetAddrVector* sendAddresses, + osiSockAddr& bindAddress, InetAddrVector* sendAddresses, short remoteTransportRevision) : _closed(false), _responseHandler(responseHandler), - _channel(channel), _socketAddress(bindAddress), - _bindAddress(bindAddress), _sendAddresses(sendAddresses), + _channel(channel), _sendAddresses(sendAddresses), _ignoredAddresses(NULL), _sendTo(NULL), _receiveBuffer( new ByteBuffer(MAX_UDP_RECV)), _sendBuffer( new ByteBuffer(MAX_UDP_RECV)), _lastMessageStartPosition(0), _readBuffer( new char[MAX_UDP_RECV]), _mutex(new Mutex()), _threadId(NULL) { + _socketAddress = new osiSockAddr; + memcpy(_socketAddress, &bindAddress, sizeof(osiSockAddr)); + _bindAddress = _socketAddress; + } BlockingUDPTransport::~BlockingUDPTransport() { close(true); // close the socket and stop the thread. + if(_sendTo!=NULL) delete _sendTo; + delete _socketAddress; + // _bindAddress equals _socketAddress + delete _receiveBuffer; delete _sendBuffer; delete[] _readBuffer; @@ -89,7 +96,10 @@ namespace epics { sender->send(_sendBuffer, this); sender->unlock(); endMessage(); - send(_sendBuffer, _sendTo); + if(_sendTo==NULL) + send(_sendBuffer); + else + send(_sendBuffer, *_sendTo); } catch(...) { sender->unlock(); } @@ -172,7 +182,7 @@ namespace epics { _receiveBuffer->flip(); - processBuffer(&fromAddress, _receiveBuffer); + processBuffer(fromAddress, _receiveBuffer); } } else { @@ -210,7 +220,7 @@ namespace epics { errlogSevPrintf(errlogInfo, "Thread '%s' exiting", threadName); } - bool BlockingUDPTransport::processBuffer(osiSockAddr* fromAddress, + bool BlockingUDPTransport::processBuffer(osiSockAddr& fromAddress, ByteBuffer* receiveBuffer) { // handle response(s) @@ -238,7 +248,7 @@ namespace epics { if(nextRequestPosition>receiveBuffer->getLimit()) return false; // handle - _responseHandler->handleResponse(fromAddress, this, + _responseHandler->handleResponse(&fromAddress, this, (int8)(magicAndVersion&0xFF), command, payloadSize, _receiveBuffer); @@ -251,32 +261,32 @@ namespace epics { } bool BlockingUDPTransport::send(ByteBuffer* buffer, - const osiSockAddr* address) { - if(address==NULL&&_sendAddresses==NULL) return false; + const osiSockAddr& address) { - if(address!=NULL) { - buffer->flip(); - int retval = - sendto(_channel, buffer->getArray(), - buffer->getLimit(), 0, &(address->sa), - sizeof(sockaddr)); - if(retval<0) { - errlogSevPrintf(errlogMajor, "Socket sendto error: %s", - strerror(errno)); - return false; - } + buffer->flip(); + int retval = sendto(_channel, buffer->getArray(), + buffer->getLimit(), 0, &(address.sa), sizeof(sockaddr)); + if(retval<0) { + errlogSevPrintf(errlogMajor, "Socket sendto error: %s", + strerror(errno)); + return false; } - else { - for(size_t i = 0; i<_sendAddresses->size(); i++) { - buffer->flip(); - int retval = sendto(_channel, buffer->getArray(), - buffer->getLimit(), 0, - &(_sendAddresses->at(i)->sa), sizeof(sockaddr)); - { - if(retval<0) errlogSevPrintf(errlogMajor, - "Socket sendto error: %s", strerror(errno)); - return false; - } + + return true; + } + + bool BlockingUDPTransport::send(ByteBuffer* buffer) { + if(_sendAddresses==NULL) return false; + + for(size_t i = 0; i<_sendAddresses->size(); i++) { + buffer->flip(); + int retval = sendto(_channel, buffer->getArray(), + buffer->getLimit(), 0, &(_sendAddresses->at(i)->sa), + sizeof(sockaddr)); + { + if(retval<0) errlogSevPrintf(errlogMajor, + "Socket sendto error: %s", strerror(errno)); + return false; } } diff --git a/pvAccessApp/remote/channelSearchManager.h b/pvAccessApp/remote/channelSearchManager.h index b180e71..cb5f3c3 100644 --- a/pvAccessApp/remote/channelSearchManager.h +++ b/pvAccessApp/remote/channelSearchManager.h @@ -418,7 +418,7 @@ class MockTransportSendControl: public TransportSendControl public: void endMessage() {} void flush(bool lastMessageCompleted) {} - void setRecipient(const osiSockAddr* sendTo) {} + void setRecipient(const osiSockAddr& sendTo) {} void startMessage(int8 command, int32 ensureCapacity) {} void ensureBuffer(int32 size) {} void flushSerializeBuffer() {} diff --git a/pvAccessApp/remote/remote.h b/pvAccessApp/remote/remote.h index 4b55a0b..46f7a12 100644 --- a/pvAccessApp/remote/remote.h +++ b/pvAccessApp/remote/remote.h @@ -54,7 +54,7 @@ namespace epics { virtual void flush(bool lastMessageCompleted) =0; - virtual void setRecipient(const osiSockAddr* sendTo) =0; + virtual void setRecipient(const osiSockAddr& sendTo) =0; }; /** @@ -326,7 +326,7 @@ namespace epics { * @throws ConnectionException */ virtual Transport* connect(TransportClient* client, - ResponseHandler* responseHandler, osiSockAddr* address, + ResponseHandler* responseHandler, osiSockAddr& address, short transportRevision, int16 priority) =0; }; diff --git a/pvAccessApp/server/responseHandlers.cpp b/pvAccessApp/server/responseHandlers.cpp index 0471373..e3bbad5 100644 --- a/pvAccessApp/server/responseHandlers.cpp +++ b/pvAccessApp/server/responseHandlers.cpp @@ -147,7 +147,7 @@ namespace epics { virtual void send(ByteBuffer* buffer, TransportSendControl* control) { control->startMessage(CMD_ECHO, 0); - control->setRecipient(&_echoFrom); + control->setRecipient(_echoFrom); } virtual void lock() { diff --git a/testApp/remote/testBeaconEmitter.cpp b/testApp/remote/testBeaconEmitter.cpp index 9ddd828..0d3c904 100644 --- a/testApp/remote/testBeaconEmitter.cpp +++ b/testApp/remote/testBeaconEmitter.cpp @@ -53,7 +53,7 @@ void testBeaconEmitter() bindAddr.ia.sin_family = AF_INET; bindAddr.ia.sin_port = htons(5066); bindAddr.ia.sin_addr.s_addr = htonl(INADDR_ANY); - Transport* transport = connector.connect(NULL, &drh, &bindAddr, 1, 50); + Transport* transport = connector.connect(NULL, &drh, bindAddr, 1, 50); cout<<"Sending beacons"<getRemoteAddress()); diff --git a/testApp/remote/testBeaconHandler.cpp b/testApp/remote/testBeaconHandler.cpp index 30a51e2..0ac231c 100644 --- a/testApp/remote/testBeaconHandler.cpp +++ b/testApp/remote/testBeaconHandler.cpp @@ -112,7 +112,7 @@ void testBeaconHandler() bindAddr.ia.sin_family = AF_INET; bindAddr.ia.sin_port = htons(5067); bindAddr.ia.sin_addr.s_addr = htonl(INADDR_ANY); - Transport* transport = connector.connect(NULL, &brh, &bindAddr, 1, 50); + Transport* transport = connector.connect(NULL, &brh, bindAddr, 1, 50); (static_cast(transport))->start(); while(1) sleep(1); diff --git a/testApp/remote/testBlockingTCPClnt.cpp b/testApp/remote/testBlockingTCPClnt.cpp index c583b74..3f69392 100644 --- a/testApp/remote/testBlockingTCPClnt.cpp +++ b/testApp/remote/testBlockingTCPClnt.cpp @@ -118,7 +118,7 @@ void testBlockingTCPSender() { return; } - Transport* transport = connector.connect(&dtc, &drh, &srvAddr, + Transport* transport = connector.connect(&dtc, &drh, srvAddr, CA_MAGIC_AND_VERSION, CA_DEFAULT_PRIORITY); cout<<"Sending 10 messages..."< #include +#define SRV_IP "192.168.71.132" + using namespace epics::pvAccess; using namespace epics::pvData; @@ -41,15 +43,13 @@ public: } virtual void send(ByteBuffer* buffer, TransportSendControl* control) { - // set recipient - sendTo.ia.sin_family = AF_INET; - sendTo.ia.sin_port = htons(65000); - if(aToIPAddr("192.168.71.129", 65000, &sendTo.ia)<0) { + // SRV_IP defined at the top of the this file + if(aToIPAddr(SRV_IP, 65000, &sendTo.ia)<0) { cout<<"error in aToIPAddr(...)"<setRecipient(&sendTo); + control->setRecipient(sendTo); // send the packet count++; @@ -79,7 +79,7 @@ void testBlockingUDPSender() { bindAddr.ia.sin_port = htons(65001); bindAddr.ia.sin_addr.s_addr = htonl(INADDR_ANY); - Transport* transport = connector.connect(NULL, &drh, &bindAddr, 1, 50); + Transport* transport = connector.connect(NULL, &drh, bindAddr, 1, 50); cout<<"Sending 10 packets..."<start();