Sending int via socket from Java to C - strange results -


i have simple server written in java, sends integer connected client. have client written in c, connects server , prints out received integer.

my problem result varies. half of times executing client correct result (234), other times 8323072.

this server:

class tcpserver {   public static void main(string args[]) throws exception {      serversocket welcomesocket = new serversocket(6789);       while(true)      {         socket connectionsocket = welcomesocket.accept();         system.out.println("welcomesocket.accept() called");         datainputstream infromclient = new datainputstream(connectionsocket.getinputstream());         dataoutputstream outtoclient = new dataoutputstream(connectionsocket.getoutputstream());          outtoclient.writeint(234);      }   } 

}

and client:

int main(int argc, char *argv[]) {     if(argc != 4){         printusage();         return;     }      char* serverip = argv[1];     char* serverportc = argv[2];     char* integertosendc = argv[3];      int serverport = atoi(serverportc);     int integertosend = atoi(integertosendc);      int socketdesc = socket(af_inet, sock_stream, 0);      if(socketdesc < 0) {         printf("error when creating socket\n");         return;     }       struct sockaddr_in serveraddr;     serveraddr.sin_family = af_inet;     serveraddr.sin_port = htons(serverport);     inet_pton(af_inet, serverip, &serveraddr.sin_addr);      int connection = connect(socketdesc, (struct sockaddr*) &serveraddr, sizeof serveraddr);      if(connection < 0) {         printf("error when establishing connection\n");         return;     }      char intbuffer[4];      if(recv(socketdesc, intbuffer, sizeof intbuffer, 0) == -1){         printf("error while receiving integer\n");     }      int receivedint = ntohl(*((int *) &intbuffer));      printf("received int: %d\n", receivedint);      close(socketdesc); } 

thanks in advance help!

edit: in end did this, has same problem:

while(receivedbytes < 4){     int readbytes = read(receiversocket, &intbuffer, (sizeof intbuffer) - receivedbytes, receivedbytes);     receivedinteger += (intbuffer << (8*receivedbytes));     receivedbytes += readbytes; } 

can sure have received sizeof intbuffer bytes on client side? no can not, recv() might return less bytes requested.

mod code loop around recv() long less bytes requested have been received , no error occurred.

note recv()ing 0 bytes indicates connection had been closed other side.

also make sure server side sends in network byte order.

also^2: idea initialise variables (intbuffer here), @ least during development phase, say: prior tuning phase.


Comments

Popular posts from this blog

c# - Send Image in Json : 400 Bad request -

jquery - Fancybox - apply a function to several elements -

An easy way to program an Android keyboard layout app -