#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. Обязательно проверяйте вопросы, на которые в принципе невозможно ответить из-за неверно сформулированных предположений.