2012-03-30 2 views
0

Что записывается в сокет, когда я пишу ссылку ENUM (см. Ниже)? У меня есть что-то захваченное в whireshark, но оно не похоже на имя ENUM «JOIN» .. это не такая же длина. Сервер каким-то образом понимает, что этот код отправил перечисление JOIN.Что такое C++ запись в сокет при записи перечисления

#include <sstream> 
#include <iostream> 

... WriteToSocket(SOCKET hSocket, char *buf, int iCount) 
    send(hSocket, buf, iCount, 0); 


enum { JOIN, ...}; 
m_Command = JOIN; 
WriteToSocket (hSocket, (char *)&m_Command, sizeof(m_Command)); 

Я надеюсь, что я включил достаточно информацию и включаю заявления ...

+3

Написание переименования в гнездо дает мне ощущение надвигающейся гибели. – Corbin

+0

Это запись байтового представления того, что 'm_Command' находится в * native endian *. Скорее всего, он пишет 4-байтовое целое число. Но если вы хотите, чтобы ваш код был надежным для разных компиляторов и архитектур, используйте целые числа фиксированного размера с сетевой строгостью (см. ['Htonl (3)'] (http://linux.die.net/man/3/htonl)). Или еще лучше использовать библиотеку сериализации/маршалинга, такую ​​как [protobuf] (http://code.google.com/p/protobuf/). –

+0

Тем более, что я поддерживаю свой подход к переписыванию клиента ... Я не могу изменить сервер, хотя. К сожалению, у меня пока нет возможности компилировать и добавлять заявления печати. – jcalfee314

ответ

0

Неотъемлемого значения начинает написано. Размер varaible может варьироваться. В вашем случае размер может быть любым из 1-байтового нуля, до int - нулевой размер.

Чтобы увидеть именно то, что написано, добавьте этот код:

std::cout << "Size: " << sizeof(m_Command) << " Value: " << (int)m_Command << "\n"; 
+0

Компилятор имеет большую гибкость при выборе размера хранилища и представления перечислений, если они корректно ведут себя при преобразовании в интегральные типы. –

+0

Выходы: Размер: 4 Значение: 0 «Значение» увеличивается на единицу, когда я продвигаюсь по списку перечислений. – jcalfee314

0

Если я правильно понял, вы предполагаете «JOIN» передается по сети в виде строки. Это неверно. JOIN - это псевдоним для целочисленного значения (0, если он является первым членом перечисления). Это целочисленное значение передается по сети, сервер знает это; это конкретное целочисленное значение является псевдонимом для «JOIN». Вот почему ваш сервер работает так, как ожидалось.
Также вы не видите «JOIN» как строку в ваших журналах wirehark, но целочисленное значение, которое является псевдонимом «JOIN».

Смежные вопросы