2013-05-20 35 views
1

我是新来的套接字编程,以测试一些情况下,我使用Java端客户端通过套接字发送整数数据我想在cpp中的服务器端接收这些数据。像无法接收数据(recv在CPP)放入套接字(在Java中写()())

out=new DataOutputStream(s.getOutputStream()); 
ar=1; 
le=1; 
out.writeInt(ar); 
out.flush(); 
out.writeInt(le); 
out.flush(); 

和IM使用recv函数在CPP接收这个数据

我在客户端(JAVA)的代码看起来。上CPP侧的代码看起来像

if (int(recv(acceptFD, &number, sizeof(int), 0)) != sizeof(int)) 
    { 
    ALOGE ("error reading on socket: number of Args: %d,reutrned value =%d\n",number); 
    return; 
    } 

    for (int i = 0; i < number; i++) 
    { 
    int len; 
    if (recv(acceptFD, &len, sizeof(int), 0) != sizeof(int)) 
    { 
     ALOGE ("error reading on socket: Len of Args: expected length :%d\n",len); 
     freeDebugCallbackArgs(i, args); 
     return; 
    } 

及其表示日志作为

E/RILC(235):错误阅读插座:数参数数量的:16777216,返回值= -1073741824 E/RILC(235):插座上的误差读数:参数长度:期望长度:1075093557

如果有人发布对此的答案,这将是一个很大的帮助。 谢谢

+0

请显示您如何声明号码。另外,recv的回报值是多少? – Rolle

+0

数字被声明为整数。返回值= -1073741824是从recv – user2401368

回答

0

我stongly怀疑这是用字节顺序的问题。

表示为十六进制数16777206是为0x01000000,这是在1677206小端表示,但1大端表示。

读取您的数字作为一个字节数组,包括码,以补偿Java源和C目的地之间的不同字节顺序。

+0

返回的值可以更具体请。这个小端和大端的概念总是让我感到困惑。你可以给我一个例子 – user2401368

+0

当然。不同的计算机以不同的方式记录整数,这两种最常用的方式被称为big-endian和little-endian,只是为了说明它有多混淆,我的回答是倒退。 ;)参见http://en.wikipedia.org/wiki/Endianness为了表示数字1,可以使用四个字节0​​0 00 00 01,最后一个字节是最低有效字节。您也可以使用四个字节0​​1 00 00 00,最低有效字节在前。连接的两端不使用相同的字节顺序,所以数字出错了。 –

+0

你尝试将int转换为大端,它完美地工作。非常感谢 – user2401368