Программа, написанная на C ++, читает из сетевого сокета, а затем записывает в локальный сокет. Он использует отдельный поток для «чтения».
Когда сообщение читается, оно помещается в очередь char * (используя мьютекс из библиотек boost, чтобы сделать его потокобезопасным).
Тем временем очередь проверяется, чтобы увидеть, пуста ли она, если нет, то первое сообщение извлекается из очереди (опять же с использованием мьютекса) и записывается в локальный сокет как символ *.
Моя проблема: когда сообщение 4 байта помещается в очередь, очередь сохраняет его без проблем, однако при повторной записи сообщения оно увеличивается до восьми байтов! «Новые» четыре байта равны нулю.
Пример A
Message in: {4,0,0,0}
Saved to queue as; <4>, <0>, <0>, <0>
Read from queue as: <4>, <0>, <0>, <0>, <0>, <0>, <0>, <0>
Пример B
Message in: {4,0,0,0,8,0,0,0}
Saved to queue as; <4>, <0>, <0>, <0>, <8>, <0>, <0>, <0>
Read from queue as: <4>, <0>, <0>, <0>, <8>, <0>, <0>, <0>
Есть идеи относительно причины этого? Может ли класс очереди справиться только с минимальным количеством символов? (Не подумал бы, что есть «пустой» метод).
(Это не главная проблема, так как я никогда не говорю меньше восьми байтов; я просто хочу знать, если это произойдет и нападет на меня позже в жизни.)
Я немного покопался в Интернете и изучил документацию и обнаружил странную ссылку на буфер, но, похоже, это больше связано с использованием очереди в качестве буфера, а не с ее наличием ...
Другая информация;
ОС: RedHat
IDE: Eclipse
Код: Очередь
//Thread-safe call to save the message to the queue
void MessageQueue::SaveToQueue(char* Data)
{
// Lock the mutex to prevent any other threads accessing this member (released when method exits).
boost::mutex::scoped_lock l(m_Msg);
//int i = 0;
//while (i < sizeof(Data))//iLength)
//{
// unsigned int ByteVaule = Data[i];//pBuffer[i];//ByteValue = int(pBuffer[i]);//unsigned int(pBuffer[i]);
// cout << "Buffer in Queue" << i << ": " << ByteVaule << endl;
// i++;
//}
MsgQ.push(Data);
}
//Thread-safe call to get the message from the queue
char* MessageQueue::GetFromQueue()
{
// Lock the mutex to prevent any other threads accessing this member (released when method exits).
boost::mutex::scoped_lock l(m_Msg);
char* message = MsgQ.front();
MsgQ.pop();
return message;
}
//Thread-safe call to check if the queue is empty
bool MessageQueue::IsEmpty()
{
// Lock the mutex to prevent any other threads accessing this member (released when method exits).
boost::mutex::scoped_lock l(m_Msg);
return MsgQ.empty();
}
Код: менеджер
int iStatus = 0;
//Start class to store message queue
MessageQueue* pQueue = new MessageQueue();
// Current hard coded value for the write scoket location
// TODO: change this to reading from enviroment variable
string WritePath = "DefaultSocket";
ReadSocket* pRead = new ReadSocket();
WriteSocket* pWrite = new WriteSocket();
cout << "Creating read socket" << endl;
iStatus = pRead->CreateSocket(pQueue);
cout << "Creating write socket." << endl;
iStatus = pWrite->CreateSocket(WritePath);
//while is running, check the message container and process it as needed
while (pRead->IsRunning())
{
while (!(pQueue->IsEmpty()))
{
char* Msg = pQueue->GetFromQueue();
iStatus = pWrite->WriteToSocket(Msg);
// TODO: catch on failure
}
//sleep(1);
}
//Destroy sockets as program is closing
pWrite->~WriteSocket();
pRead->~ReadSocket();
// TODO: add exception?
//Token return
return iStatus;
Чтобы сделать это слишком длинным и сложным, сокеты чтения и записи такие же, как в
http://www.linuxhowtos.org/C_C++/socket.htm
Символ чтения * сохраняется в очереди с помощью
SaveToQueue()
метод и взят из очереди с помощью
GetFromQueue
способ.