954,506 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

Data loss in Type Conversion.

Hello Everyone,

I'm working on a couple of programs, client/server. I'm using winsock library to handle data transfer between the two programs. I'm having a problem when it comes to sending int values, they must be converted to (char *) since that's the data type of the buffers used in the socket Send() and Recv() functions. to elaborate, consider the following:

Client side:
-----------
unsigned char rnd[4];
int noncer =0;

// Generating a random number
RAND_pseudo_bytes(rnd,sizeof(rnd));

noncer = (int)rnd;

non1=(char*)noncer;

// These two lines produce the same output which is 1244556
cout <<"\n Noncer :" << noncer << "\n";
cout.flush();
cout <<"\n Noncer char :" << (int)non1 << "\n";
cout.flush();

SendData(Socket, non1);

Server Side:
-----------
int client_nonce;
char String[50];
String_initialization(String);

// Reading the nonce identifier
RecieveMessage(socket, String, number_of_bytes);
client_nonce = (int)String;

// this results in 1244588 !!
cout<<"\n the nonce is:"<

Layla_2401
Newbie Poster
22 posts since Sep 2004
Reputation Points: 11
Solved Threads: 0
 

Don't play around with casting like that unless you know what you're doing. Type punning can be tricky business, but barring transmission issues with your sockets, this should work:

#include <cstring>
#include <iostream>

using namespace std;

int main()
{
  int i1 = 12345;
  char buffer[sizeof ( int )];

  memcpy ( buffer, (unsigned char *)&i1, sizeof ( int ) ); // Simulate send/recv

  int *pi = (int *)buffer;
  cout<< *pi <<endl;
}
Narue
Bad Cop
Administrator
15,460 posts since Sep 2004
Reputation Points: 6,464
Solved Threads: 1,401
 

Hi Narue,

Thank you SO much for your help, I now get the same value at both sides :)

Layla_2401
Newbie Poster
22 posts since Sep 2004
Reputation Points: 11
Solved Threads: 0
 

Hi I am having the same problem, but I couldnt solve it.
I need to send a CString with Unicode (16bit) to the send and recv function. Unfortunately all i get is garbage :)
Any help is welcomed

dimkovtrajce
Newbie Poster
1 post since Mar 2006
Reputation Points: 10
Solved Threads: 0
 

Don't resurrect a two year old thread to say "me too"! Start a new thread if you have a new question. Geez.

Narue
Bad Cop
Administrator
15,460 posts since Sep 2004
Reputation Points: 6,464
Solved Threads: 1,401
 

This article has been dead for over three months

Post: Markdown Syntax: Formatting Help
You