我正在为我的学习做一些事情,所以是的,这是家庭作业。
首先:我有一个工作的 Java 服务器应用程序,我也有这个我正在用 c 编写的客户端应用程序现在在 java 中工作。很简单,我无法将 uint32_t 发送到我的 java 服务器。
所以让我们展示一些代码:
char* callString(char func, char* str, uint32_t anz) {
uint32_t packageLength, funcLength, strLength;
funcLength = htonl(sizeof(func));
strLength = htonl(strlen(str));
uint32_t byte = htonl(4);
uint32_t trailing = htonl(1);
anz = htonl(anz);
packageLength = byte + byte + funcLength + byte + strLength + byte + byte + trailing;
/*packageLength = htonl(packageLength);*/
char byteBuffer[ntohl(packageLength)];
printf("%i\n", packageLength);
printf("%i\n", htonl(packageLength));
printf("%i\n", ntohl(packageLength));
sprintf(byteBuffer, "%i%i%c%i%s%i%i%c", packageLength, byte, func, byte, str, byte, anz, '\0');
printf("%s\n", byteBuffer);
if(write(sock, byteBuffer, packageLength) < 0) {
printf("write: Konnte keine Daten zum gegenüber senden.\n");
exit(EXIT_FAILURE);
}
char* retVal = "hallo";
return retVal;
}
很简单,我用 func = 'v', str = "hallo" 和 anz = 2 调用这个函数,这将给我一个 27 字节的 packageLength。
包是这样构建的:
= packageLength (int),它是 4 字节
+ 函数描述符的长度 (funcLength),它是 4 字节
+ func 描述符 (func),它是 funcLength
+ param1 的长度 (strLength),它是 4 字节
+ 长度param1 (str) 的值是 strLength
+ param2 的长度是 4 字节
+ param2 (anz) 的值是 4 字节
+ NULL 字节 (\0) 是 1 字节
我假设我所做的转换是错误的,也许我使用了错误的数据类型。在服务器端,我使用 Java ByteBuffer 来收集数据。首先,我从网络中读取了 4 字节的包长度,这将告诉我在获得整个数据包之前我必须阅读多长时间:
byte[] msgLength = new byte[4];
try {
handle.getInputStream().read(msgLength);
} catch (IOException ex) {
System.out.println("could not receive byte stream: msgLength");
break;
}
ByteBuffer receive;
receive = ByteBuffer.wrap(msgLength);
int packageLength = receive.getInt();
System.out.println("packageLength" + packageLength);
最后一个 println 会给我以下输出:
包装长度875901497
那么有人现在我的问题出在哪里吗?如有必要,我可以为您提供更多代码,但我认为错误是数据类型(uint32_t)或转换。
帮助被appriciated。提前致谢。
干杯丹尼尔