• C

sending and receiving 2D array using UDP

I am trying to send and recieve a 5x5 int array.

In my code I have for sending(UDP) int distvector[5][5]:

        remoteServAddr.sin_port = htons(5000+i*1000);
        rc = sendto(sd, &distvector, sizeof((int)distvector[5][5]), 0,
        (struct sockaddr *) &remoteServAddr,

And for recieving I have (UDP) int recv_DV[5][5]:

        recvfrom(sd, &recv_DV, sizeof((int)recv_DV[5][5]), 0,
         (struct sockaddr *) &cliAddr, &cliLen);

i dont recieve the right array, recv_DV[0][0] has an odd number in it (I suppose its the array's address) and the rest of the array is '0'.  Also in the sendto() function I used distvector instead of &distvector but still the same result.

ne help would be much appreciated.

Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

your size expression "sizeof((int)distvector[5][5]), " is probably computing the size of an integer.

Try making a new variable:  Length = sizeof( distvector ), print out it's value to be sure, and use it in the send and recv calls.
That should work a heck of a lot better.

And you do realize that UDP isnt guaranteed to deliver anything at all, and no guarantee what order packets arrive?

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
-----> rc = sendto(sd, &distvector, sizeof((int)distvector[5][5]), 0,
        (struct sockaddr *) &remoteServAddr,

U are using sizeof ( (int) distvector[5][5] ) ---.> This would give u the size of the last element in your array i.e. the size of int on your machine

For getting the size of whole array, u should use         sizeof ( distvector )
Same comment above applies to recvfrom also
Put Your Flow Data to Work

SolarWinds® Flow Tool Bundle combines three easy-to-download, easy-to-use flow analysis tools that can help you quickly distribute, test, and configure your flow traffic.

Also I don't think you would need to pass &distvector in sendto OR recvfrom

both these functions expect a void pointer *. So U can just pass szDataFromUdp as the second parameter to sendto and recvfrom.

Basically the second parameter expects the starting address of the data to be passed and the amount of data passed is governed by the next parameter.

Thus only using szDataFromUdp  as second parameter would give u the base address of the data and sizeof( szDataFromUdp ) would give u the amount of data to be passed
Your code looks clean and should work .. just a suggestion calculate the length before hand and use that in send and recv functions like

//for sending
int distvector[5][5],len;
len = sizeof(distvector);
sendto(sd,&distvector,len,0,(struct sockaddr *) &remoteServAddr,sizeof(remoteServAddr);

// for receiving
int recv_DV[5][5],len;
len = sizeof(recv_DV);
recvfrom(sd, &recv_DV, len, 0,(struct sockaddr *) &cliAddr, &cliLen);
Hi Ajar,

I think, as I already posted, the second parameter shoudl be distvector and NOT &distvector

Your code would pass the len amount of data starting from ADDRESS of distvector

Sorry Guys,

I am really sorry

Did not come to mind that distvector and &distvector would be same
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today

From novice to tech pro — start learning today.