How do I send an array of integers over TCP in C?

35,291

Solution 1

the prototype for write is:

ssize_t write(int fd, const void *buf, size_t count);

so while it writes in units of bytes, it can take a pointer of any type. Passing an int* will be no problem at all.

EDIT:

I would however, recomend that you also send the amount of integers you plan to send first so the reciever knows how much to read. Something like this (error checking omitted for brevity):

int x[10] = { ... };
int count = 10;
write(sock, &count, sizeof(count));
write(sock, x, sizeof(x));

NOTE: if the array is from dynamic memory (like you malloced it), you cannot use sizeof on it. In this case count would be equal to: sizeof(int) * element_count

EDIT:

As Brian Mitchell noted, you will likely need to be careful of endian issues as well. This is the case when sending any multibyte value (as in the count I recommended as well as each element of the array). This is done with the: htons/htonl and ntohs/ntohl functions.

Solution 2

Write can do what you want it to, but there's some things to be aware of:

1: You may get a partial write that's not on an int boundary, so you have to be prepared to handle that situation

2: If the code needs to be portable, you should convert your array to a specific endianess, or encode the endianess in the message.

Solution 3

Yes, you can just cast a pointer to your buffer to a pointer to char, and call write() with that. Casting a pointer to a different type in C doesn't affect the contents of the memory being pointed to -- all it does is indicate the programmer's intention that the contents of memory at that address be interpreted in a different way.

Just make sure that you supply write() with the correct size in bytes of your array -- that would be the number of elements times sizeof (long) in your case.

Solution 4

The simplest way to send a single int (assuming 4-byte ints) is :

int tmp = htonl(myInt);
write(socket, &tmp, 4);

where htonl is a function that converts the int to network byte order. (Similarly,. when you read from the socket, the function ntohl can be used to convert back to host byte order.)

For an array of ints, you would first want to send the count of array members as an int (in network byte order), then send the int values.

Solution 5

Declare a character array. In each location of the array, store integer numbers, not characters. Then you just send that.

For example:

char tcp[100];

tcp[0] = 0;
tcp[1] = 0xA;
tcp[2] = 0xB;
tcp[3] = 0xC;
.
.

// Send the character array
write(sock, tcp, sizeof(tcp));
Share:
35,291
Nick Bolton
Author by

Nick Bolton

Hello, I'm the CEO of Symless, the company behind Synergy, software that lets you share one mouse and keyboard between multiple computers.

Updated on October 07, 2020

Comments