#include <iostream>
#include <set>
+#include <cstring>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
/* 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;
readPacketCount = 0;
writtenPacketCount = 0;
port = pPort;
+
pthread_mutex_init(&clientInfo.sleeplock, NULL);
pthread_mutex_init(&clientInfo.countlock, NULL);
pthread_cond_init(&clientInfo.wakeup, NULL);
{
char l;
char* buffer[SFPacket::getMaxPayloadLength()];
-
- if (readFD(pFD, &l, 1) != 1)
+ int err;
+
+ if (readFD(pFD, &l, 1, &err) != 1)
{
return false;
}
{
return false;
}
- if (readFD(pFD, (char*) buffer, static_cast<int>(l)) != l)
+ if (readFD(pFD, (char*) buffer, static_cast<int>(l), &err) != l)
{
return false;
}
}
}
-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)
#else
int n = send(fd, buffer, count, MSG_NOSIGNAL);
#endif
- if (n == -1)
- {
+ if (n == -1) {
+ *err = errno;
return -1;
}
count -= n;
/* 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 */
{
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;
}
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);
}
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() {