Как отправить целое число через сокет?

#c

#c

Вопрос:

Я пытаюсь отправить целое число через сокет. Я использую этот код для этого; однако мой C-код не будет компилироваться. Компилятор жалуется, что myInt не был объявлен.

 int tmp = htonl(myInt);
write(socket, amp;tmp, sizeof(tmp));
  

Как мне объявить myInt? Спасибо.

Комментарии:

1. Разве это не должно называться «Как мне объявить целое число?» Какое отношение проблема имеет к сокетам?

Ответ №1:

Вы уверены, что оно было правильно объявлено в вашей программе?

Попробуйте вот так:

 int myInt = something;    
int tmp = htonl((uint32_t)myInt);
write(socket, amp;tmp, sizeof(tmp));
  

Комментарии:

1. Не вызывайте htonl данные, которые вы планируете отправить через сокет.

2. @zneak: Не могли бы вы уточнить? Обычно это именно то, что вы хотите сделать.

3. Да, WTF? Это именно то, для чего это нужно.

4. @zneak — pssst, не все машины поддерживают x86. Ваш «ложный шаг» — это то, как вы обеспечиваете порядок байтов. Машина с большим порядковым номером ntohl не изменит порядок байтов, поскольку это тот порядок, который ей нужен

5. @Brian Roach Я согласен, что порядок байтов важен, но использование htonl не выглядит хорошим решением для этого. Эти встроенные модули были созданы для работы в сети и содержат логику для целых чисел 16 и 32 бита. Нет эквивалента, скажем, для 64-разрядных целых чисел или вещественных чисел IEEE с плавающей запятой. Я почти уверен, что вам лучше использовать свои собственные процедуры для переключения целых структур; или просто объявить, что ваш сетевой протокол имеет порядковый номер, поскольку это совершенно произвольный выбор.

Ответ №2:

Возможно, вам придется просто потратить некоторое время на изучение базового C, прежде чем браться за библиотеку сокетов.

Вам нужно объявить myInt как переменную типа integer следующим образом:

   int myInt;
  

Это вводит компилятор в идентификатор с именем «myInt», тип которого равен int. Затем компилятор может принимать решения о том, допустимы ли ваши действия с myInt, основываясь на его типе.

Почти всегда хорошей идеей также является присвоение переменной начального значения:

   int myInt = 0;
  

Ответ №3:

Одним из простых решений является преобразование целого числа в символ char и отправка 4 байт буфера символов

int myInt char * ptr = amp;myInt; write(сокет, ptr, sizeof(int));

в конце получения считайте 4 байта.. у вас не возникнет проблем с порядком завершения.

Комментарии:

1. У вас наверняка возникнут проблемы с порядковым номером, если два хоста имеют разный порядковый номер.

2. Я думаю, вы имели в виду преобразовать целое число в текстовое представление (такое, которое вы могли бы видеть в XML или JSON). Проблема в том, что вы только что опубликовали… этого не делает. Вам нужно было бы использовать sprintf() , например, для выполнения преобразования.

Ответ №4:

Преобразуйте все в char , вам не придется беспокоиться о порядковом номере, потому что char это байт, вместо этого считывайте его байт за байтом.

Комментарии:

1. Добро пожаловать в Stack. Отвечая на вопрос, лучше всего либо ответить на вопрос, либо объяснить, почему другой подход лучше.

2. Выполнение этого гарантирует, что принимающая сторона понятия не имеет, как это прочитать. При работе с сокетами всегда следует использовать сетевой порядок.

3. Обязательно проверяйте вопросы, на которые в принципе невозможно ответить из-за неверно сформулированных предположений.