X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=support%2Fsdk%2Fcpp%2Fsf%2Ftcpcomm.cpp;h=2e77a22cfca9efcf0b636fbe1f6856dcc5f7be9b;hb=e9bfab607e051bae6afb47b44892ce37541d1b44;hp=762487f6a25b2c9ea916c547af9ef90b79d0267a;hpb=dd6ea733b095870a1d797dc1f6465a34c8227633;p=tinyos-2.x.git diff --git a/support/sdk/cpp/sf/tcpcomm.cpp b/support/sdk/cpp/sf/tcpcomm.cpp index 762487f6..2e77a22c 100644 --- a/support/sdk/cpp/sf/tcpcomm.cpp +++ b/support/sdk/cpp/sf/tcpcomm.cpp @@ -38,6 +38,7 @@ #include #include +#include #include #include #include @@ -57,7 +58,7 @@ void* writeClientsThread(void*); /* opens tcp server port for listening and start threads*/ TCPComm::TCPComm(int pPort, PacketBuffer &pReadBuffer, PacketBuffer &pWriteBuffer, sharedControlInfo_t& pControl) : readBuffer(pReadBuffer), writeBuffer(pWriteBuffer), errorReported(false), errorMsg(""), control(pControl) -{ +{ // init values writerThreadRunning = false; readerThreadRunning = false; @@ -67,6 +68,7 @@ TCPComm::TCPComm(int pPort, PacketBuffer &pReadBuffer, PacketBuffer &pWriteBuffe readPacketCount = 0; writtenPacketCount = 0; port = pPort; + pthread_mutex_init(&clientInfo.sleeplock, NULL); pthread_mutex_init(&clientInfo.countlock, NULL); pthread_cond_init(&clientInfo.wakeup, NULL); @@ -144,6 +146,8 @@ TCPComm::~TCPComm() { close(*it); } + close(pipeWriteFD); + close(pipeReadFD); pthread_mutex_destroy(&clientInfo.sleeplock); pthread_mutex_destroy(&clientInfo.countlock); pthread_cond_destroy(&clientInfo.wakeup); @@ -159,8 +163,9 @@ bool TCPComm::readPacket(int pFD, SFPacket &pPacket) { char l; char* buffer[SFPacket::getMaxPayloadLength()]; - - if (readFD(pFD, &l, 1) != 1) + int err; + + if (readFD(pFD, &l, 1, &err) != 1) { return false; } @@ -168,7 +173,7 @@ bool TCPComm::readPacket(int pFD, SFPacket &pPacket) { return false; } - if (readFD(pFD, (char*) buffer, static_cast(l)) != l) + if (readFD(pFD, (char*) buffer, static_cast(l), &err) != l) { return false; } @@ -182,7 +187,7 @@ bool TCPComm::readPacket(int pFD, SFPacket &pPacket) } } -int TCPComm::writeFD(int fd, const char *buffer, int count) +int TCPComm::writeFD(int fd, const char *buffer, int count, int *err) { int actual = 0; while (count > 0) @@ -192,8 +197,8 @@ int TCPComm::writeFD(int fd, const char *buffer, int count) #else int n = send(fd, buffer, count, MSG_NOSIGNAL); #endif - if (n == -1) - { + if (n == -1) { + *err = errno; return -1; } count -= n; @@ -206,16 +211,9 @@ int TCPComm::writeFD(int fd, const char *buffer, int count) /* writes packet */ bool TCPComm::writePacket(int pFD, SFPacket &pPacket) { - char len = pPacket.getLength(); - if (writeFD(pFD, &len, 1) != 1) - { - return false; - } - if (writeFD(pFD, pPacket.getPayload(), len) != len) - { - return false; - } - return true; + int len = pPacket.getTcpLength(); + int err; + return (writeFD(pFD, pPacket.getTcpPayload(), len, &err) == len); } /* checks for correct version of SF protocol */ @@ -223,15 +221,16 @@ bool TCPComm::versionCheck(int clientFD) { char check[2], us[2]; int version; - + int err = 0; /* Indicate version and check if a TinyOS 2.0 serial forwarder on the other end */ us[0] = 'U'; us[1] = ' '; - if (writeFD(clientFD, us, 2) != 2) + + if (writeFD(clientFD, us, 2, &err) != 2) { return false; } - if (readFD(clientFD, check, 2) != 2) + if (readFD(clientFD, check, 2, &err) != 2) { return false; } @@ -393,14 +392,12 @@ void TCPComm::readClients() if (FD_ISSET(*it, &rfds)) { SFPacket packet; - if (readPacket(*it, packet)) - { + if(readPacket(*it, packet)) { // this call blocks until buffer is not full readBuffer.enqueueBack(packet); ++readPacketCount; } - else - { + else { DEBUG("TCPComm::readClients : removeClient") removeClient(*it); } @@ -586,7 +583,7 @@ void TCPComm::reportStatus(ostream& os) void TCPComm::stuffPipe() { char info = 'n'; - write(pipeWriteFD, &info, 1); + if(write(pipeWriteFD, &info, 1) != 1) DEBUG("TCPComm::stuffPipe : lokal pipe is broken"); } void TCPComm::clearPipe() {