From 6b583365d1f0f5c7ff613ecfc323c4d1eba1699d Mon Sep 17 00:00:00 2001 From: christian mueller Date: Fri, 23 Dec 2011 14:32:22 +0100 Subject: * finally, first socket test work --- .../test/sockethandler/sockethandlerTest.cpp | 269 ++++++++++++--------- .../test/sockethandler/sockethandlerTest.h | 39 +-- 2 files changed, 180 insertions(+), 128 deletions(-) diff --git a/AudioManagerDaemon/test/sockethandler/sockethandlerTest.cpp b/AudioManagerDaemon/test/sockethandler/sockethandlerTest.cpp index bb72324..69af391 100644 --- a/AudioManagerDaemon/test/sockethandler/sockethandlerTest.cpp +++ b/AudioManagerDaemon/test/sockethandler/sockethandlerTest.cpp @@ -12,7 +12,10 @@ #include #include #include +#include +#include +#define SOCK_PATH "/tmp/mysock" using namespace testing; using namespace am; @@ -25,56 +28,6 @@ sockethandlerTest::~sockethandlerTest() { } -void fdCallBack::connectSocket(int fd, const int16_t events,void * userData) -{ - std::cout<<"Socket connection received and open"<addFDPoll(mSocketConnection,event,buf,NULL); -} - - - - -fdCallBack::fdCallBack(SocketHandler *SocketHandler) -:mSocketConnection(0), - mSocketHandler(SocketHandler), - pSocketDataCallback(this, &fdCallBack::handleSocketData), - pSocketConnectionCallback(this, &fdCallBack::connectSocket) -{ -} - - - -void am::fdCallBack::handleSocketData(int fd, const int16_t events, void* userdata) -{ - char buffer[3000]; - std::string msg; - - //there is something for us, read it - int read=recv(mSocketConnection,buffer,sizeof(buffer),NULL); - msg=std::string(buffer,read); - if (msg.compare("stopit")==0) - { - mSocketHandler->stop_listening(); - } - else if (msg.compare("answer")==0) - { - std::string answer="myAnswer"; - send(mSocketConnection,answer.c_str(),answer.size(),NULL); - } -} - -fdCallBack::~fdCallBack() -{ -} - am::timerCallBack::timerCallBack(SocketHandler *myHandler) :pTimer1Callback(this, &timerCallBack::timer1Callback), pTimer2Callback(this, &timerCallBack::timer2Callback), @@ -93,71 +46,46 @@ am::timerCallBack::~timerCallBack() -void am::timerCallBack::timer1Callback(SocketHandler::sh_timerHandle_t handle, void* userData) +void am::timerCallBack::timer1Callback(sh_timerHandle_t handle, void* userData) { std::cout<<"callback1 called"<addTimer(timeout,buf,handle_,NULL); } -void am::timerCallBack::timer2Callback(SocketHandler::sh_timerHandle_t handle, void* userData) +void am::timerCallBack::timer2Callback(sh_timerHandle_t handle, void* userData) { std::cout<<"callback2 called"<addTimer(timeout,buf,handle_,NULL); } -void am::timerCallBack::timer3Callback(SocketHandler::sh_timerHandle_t handle, void* userData) +void am::timerCallBack::timer3Callback(sh_timerHandle_t, void* userData) { std::cout<<"callback3 called"<stop_listening(); } void* playWithSocketServer(void* data) { - int yes = 1; - - //get a SocketHandler SocketHandler myHandler; - - //get a class that handles the callbacks from the handler - fdCallBack testCallback(&myHandler); - - //prepare the socket, bind etc... - struct sockaddr_in servAddr; - int socketHandle = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); - setsockopt(socketHandle, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)); - servAddr.sin_family = AF_INET; - servAddr.sin_addr.s_addr = htonl(INADDR_ANY); - servAddr.sin_port = htons(6060); - bind(socketHandle, (struct sockaddr*)(&servAddr), sizeof (servAddr)); - listen(socketHandle, 3); - - //prepare the event (we want POLLIN because we need to listen) - int16_t event = 0; - event |=POLLIN; - - shPollCallBack* buf=&testCallback.pSocketConnectionCallback; - //add the callback to the Sockethandler - myHandler.addFDPoll(socketHandle, event, buf, NULL); - - //start the mainloop + SamplePlugin myplugin(&myHandler); myHandler.start_listenting(); - close(socketHandle); } @@ -166,36 +94,45 @@ TEST(sockethandlerTest,playWithSockets) { pthread_t serverThread; char buffer[3000]; + struct sockaddr_in servAddr; + unsigned short servPort = 6060; + struct hostent *host; + int socket_; //creates a thread that handles the serverpart pthread_create(&serverThread,NULL,playWithSocketServer,NULL); - sleep(1); //give a little time to settle everything - //make everything ready to send data - struct sockaddr_in servAddr; - int socketHandle = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); - struct hostent *host; - host = (struct hostent*) gethostbyname("localhost"); + sleep(1); //we need that here because the port needs to be opened + if ((socket_ = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) + { + std::cout<<"socket problem"<h_addr_list[0], host->h_length); - servAddr.sin_family = AF_INET; - servAddr.sin_port = htons(6060); + if ((host = (struct hostent*) gethostbyname("localhost")) == 0) + { + std::cout<<"ERROR: gethostbyname() failed\n"< h_addr_list[0]))); + servAddr.sin_port = htons(servPort); - //send first the answer message and wait for the reply - int p=send(socketHandle,msg.c_str(),msg.size(),NULL); - int read=recv(socketHandle,buffer,sizeof(buffer),NULL); - msg=std::string(buffer,read); - ASSERT_TRUE(msg.compare("myAnswer")==0); + if (connect(socket_, (struct sockaddr *) &servAddr, sizeof(servAddr)) < 0) + { + std::cout<<"ERROR: connect() failed\n"<addFDPoll(socketHandle,events,NULL,&connectFiredCB,NULL,NULL,NULL,mConnecthandle); + std::cout<<"setup server - listening"<addFDPoll(receiveFD,event,NULL,&receiveFiredCB,&sampleCheckCB,&sampleDispatchCB,NULL,mReceiveHandle); + +} + + + +void am::SamplePlugin::receiveData(const pollfd pollfd, const sh_pollHandle_t handle, void *userData) +{ + //initialize buffer + char buffer[10]; + //read until buffer is full or no more data is there + int read=recv(pollfd.fd,buffer,7,NULL); + if (read>1) + { + //read the message and store it in a queue + std::string msg=std::string(buffer,read); + msgList.push(msg); + std::cout<<"Got a message !"<stop_listening(); + } + //remove the message from the queue and return false if there is no more message to read. + msgList.pop(); + if (msgList.size()!=0) return true; + return false; +} + +bool am::SamplePlugin::check(const sh_pollHandle_t handle, void *userData) +{ + //checks if there is data to dispatch + std::cout<<"check!:"< +#include #include "SocketHandler.h" namespace am { -class fdCallBack +class SamplePlugin { public: - fdCallBack(SocketHandler *SocketHandler); - virtual ~fdCallBack(); - void connectSocket(int fd,const int16_t events,void * userData); - void handleSocketData(int fd,const int16_t events,void * userData); - TSpecificPollCallback pSocketDataCallback; - TSpecificPollCallback pSocketConnectionCallback; + SamplePlugin(SocketHandler *mySocketHandler); + virtual ~SamplePlugin() {}; + void connectSocket(const pollfd pollfd,const sh_pollHandle_t handle, void* userData); + void receiveData(const pollfd pollfd,const sh_pollHandle_t handle, void* userData); + bool dispatchData(const sh_pollHandle_t handle, void* userData); + bool check(const sh_pollHandle_t handle, void* userData); + shPollFired_T connectFiredCB; + shPollFired_T receiveFiredCB; + shPollDispatch_T sampleDispatchCB; + shPollCheck_T sampleCheckCB; private: - int mSocketConnection; SocketHandler *mSocketHandler; + sh_pollHandle_t mConnecthandle,mReceiveHandle; + std::queue msgList; }; + class timerCallBack { public: timerCallBack(SocketHandler *SocketHandler); virtual ~timerCallBack(); - void timer1Callback(SocketHandler::sh_timerHandle_t handle,void * userData); - void timer2Callback(SocketHandler::sh_timerHandle_t handle,void * userData); - void timer3Callback(SocketHandler::sh_timerHandle_t handle,void * userData); - void timer4Callback(SocketHandler::sh_timerHandle_t handle,void * userData); - TSpecificTimerCallback pTimer1Callback; - TSpecificTimerCallback pTimer2Callback; - TSpecificTimerCallback pTimer3Callback; - TSpecificTimerCallback pTimer4Callback; + void timer1Callback(sh_timerHandle_t handle,void * userData); + void timer2Callback(sh_timerHandle_t handle,void * userData); + void timer3Callback(sh_timerHandle_t handle,void * userData); + void timer4Callback(sh_timerHandle_t handle,void * userData); + shTimerCallBack_T pTimer1Callback; + shTimerCallBack_T pTimer2Callback; + shTimerCallBack_T pTimer3Callback; + shTimerCallBack_T pTimer4Callback; SocketHandler *mSocketHandler; }; -- cgit v1.2.1