Канал - это просто поток байтов, даже если вы правильно интерпретировали прочитанные байты как 16-битное целое число и как двухсимвольную строку «11», которая в ASCII является байтами 31 31
, тогда как вы скажете «11»кроме целого 12593?Они имеют одинаковое двоичное представление.
Один из вариантов - просто продолжать чтение, пока канал не будет завершен, это может быть, скажем, подходящим для передачи файла.Но не разрешает отправлять туда и обратно сообщения.
write(mypipe, &random_int, sizeof(short));
close(mypipe); // finished writing
// recv
while (true)
{
short received_int;
if (read(mypipe, &received_int, sizeof(short)) == sizeof(short)) // Not handling the int getting split into two separate read's here
{
// Use received_int
}
else return; // 0 on close
}
Вот почему большинство протоколов вводят концепцию сообщений поверх потока (в текстовом или двоичном формате).Например, вы можете иметь 8-битный «код операции» и сказать, что 0 - это «отключить», а 1 - «сообщение с целым числом», поэтому для записи целого числа:
unsigned char opcode = 1;
short random_int = 55; // Make sure it actually a short, as you used sizeof(short)!
write(mypipe, &opcode, 1);
write(mypipe, &random_int, sizeof(short));
И чтобы прочитать, сначала прочитайте код операциии затем решите:
char opcode;
read(mypipe, &opcode, 1); // CHECK RETURN!
switch (opcode)
{
case 0: return; // Finished
case 1:
{
short received_int;
read(mypipe, &received_int, sizeof(short)); // CHECK RETURN!
// Use received_int
break;
}
}
Вы можете посмотреть на некоторые существующие протоколы о том, как они кодируют разные вещи в поток байтов.