2012-06-21 2 views
4

В программе мне нужно отправить целочисленное значение через сокет TCP. Я использовал функции send() и recv() для этой цели, но они отправляют и принимают его только как строку.Отправить и получить целочисленное значение по TCP в C

Есть ли альтернатива для send() и recv(), чтобы отправлять и получать целые значения?

+1

'send()' и 'recv()' обрабатывать байты. То, как вы интерпретируете эти байты, зависит от вас. –

+0

Что такое langauge? Поделитесь своим фрагментом кода здесь, чтобы получить более точные ответы. – Usman

+1

@ Усман: обычно просить фрагмент кода - хорошая идея, но обратите внимание на тег [tag: c]. Большинство вопросов помечены таким образом. – sarnold

ответ

4

Вы можете отправить целое число как четыре байта, конечно (или сколько бы байтов ни было ваше целое); но вы должны быть осторожны. См. Функцию htonl(), представленную в вашей системе, вероятно, в <arpa/inet.h>.

Предполагая четыре-байтовое целое число п, это может сделать то, что вы хотите:

uint32_t un = htonl(n); 
send(sockfd, &un, sizeof(uint32_t), flags); 

Тогда вы можете написать дополнение на приемном конце.

Причина, по которой звонок htonl() заключается в том, что старший байт обычно передается сначала через Интернет, тогда как некоторые архитектуры компьютеров, такие как вездесущие x86, сначала хранят младший байт. Если вы не исправите порядок байтов, а машина на одном конце - x86, а машина на другом конце - это что-то другое, то без htonl() целое число будет искажено.

Я не эксперт по этой теме, кстати, но в отсутствие experter ответов этот ответ может служить. Удачи.

+0

Это работает как ожидалось в кросс-компиляции и в смешанной среде компиляции. –

8

send() и recv() не отправлять строки. Они отправляют байт. Это зависит от вас, чтобы обеспечить интерпретацию байтов, что имеет смысл.

Если вы хотите отправить целые числа, вам нужно решить, какие числа целых чисел вы собираетесь отправлять - 1 байт, 2 байта, 4 байта, 8 байтов и т. Д. Вам также необходимо принять решение о encoding format. "Network order" описывает соглашение о форматировании Big-Endian. Вы можете конвертировать и из сети для того, используя следующие функции от <arpa/inet.h> или <netinet/in.h>:

uint32_t htonl(uint32_t hostlong); 
    uint16_t htons(uint16_t hostshort); 
    uint32_t ntohl(uint32_t netlong); 
    uint16_t ntohs(uint16_t netshort); 

Если вы будете придерживаться использования htonl() перед отправкой (хост-сети, длинный) и ntohl() после приема (сеть-to хост, длинный), вы справитесь.

4

Я тоже попробовал. Но писать не получилось. Итак, я нашел другое решение.

// send 
char integer[4];     // buffer 
*((int*)integer) = 73232;   // 73232 is data which I want to send. 
send(cs, integer, 4, 0);  // send it 

// receive 
char integer[4];     // buffer 
recv(s, integer, 4, 0);   // receive it 
+0

Он работает для меня, когда я попробовал сейчас. Интересно, почему мы не префикс амперсанда для второго аргумента. Есть идеи? –

+1

Как вы печатаете целое число в стороне приема? он должен быть таким же, как 73232 – EsmaeelE