Идея такая, на псевдокоде:
string globalBuffer;
char buffer[1024];
if( select( socket, 0, 0, tout ) )
{
int ret = recv( socket, buffer, 1024, 0 );
if( ret == 0|ret == ERROR )
{
// все плохо
}
else
{
for( int i = 0; i < ret; i++ )
globalBuffer += buffer[i];
}
}
---
И так "бесконечно". Прверяешь на готовность - вычитываешь, проверяешь - вычитываешь...
Далее в другом потоке, либо здесь же можно сделать "разбор пакета". Тебе желательно, в начале каждого пакета передавать его длинну (лучше в сетевом формате). Потом ты бежишь по этому globalBuffer и выбираешь пакеты. если пакет еще не полный, то ничего не делаешь, если пакет уже дошел весь - перекидывешь в сторадж готовых пакетов, а из globalBuffer удаляешь.
Такой алгоритм разграничивает для тебя прием данных из сокета и прием прикладных пакетов. Тебе не придется забивать голову всякими "недошедшими данными" и прочей лабудой. Так что если у тебя в коде есть ошибка, то ты найдешь её гораздо быстрей.
И еще, если два твоих узла находятся в одной подсети, то никаких "странных" ситуаций быть не должно. Если между вами хрен знает сколько непонятно как работающих узлов, то возможны "странности". например исходящая очередь сокета будет пополнятся, а уходить из неё ничего не будет, причем о разрыве соединения тебе не скажут (вернее скажут, но скорей всего сначала ты получишь ошибку переполнения буфера сокета). Почему так происходит можно почитать в других темах.
Чуть не забыл :) Ты когда send делаешь - проверяешь количество ушедших данных ?
Цикл должен быть такой:
string yourBuffer;
int size = yourBuffer.size();
int pos = 0;
while( size > 0 )
{
int ret = send( yourBuffer.c_str() + pos, size );
size -= ret;
pos += ret;
}
|