- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
编辑:老实说,我不知道错误发生在哪里,所以我只添加大部分相关代码,不确定这是否有帮助
所以基本上我有两个基本的服务器和客户端进程。用户指定命令,客户端进程将消息长度发送给服务器,服务器执行命令并返回响应消息长度。
这在第一个命令上运行良好(我连续尝试了两个 ls -la),第一个命令上的值为 1028(正确值),第二个命令上错误地为 1685223288(在客户端中)
写入是通过以下代码完成的:
server_handler() {
char str[5000];
char * token = NULL;
unsigned long totalSize = 0;
str[0] = "\0";
totalSize = htonl(totalSize); // Correct size already calculate
if((result = write(clientFD, (char *) &totalSize, sizeof(totalSize)) < 0))
{
printf("Failed sending size to client\n");
exit(-1);
}
//Here the server starts sending the results to the client
token = strtok(str, "\n"); // str array contains the results
while(token != NULL)
{
token[strlen(token)] = '\n';
write(clientFD, token, strlen(token));
token = strtok(NULL, "\n);
}
读取是通过以下方式在客户端进程中完成的:
static void handle_reply()
{
char * revBuf = 0;
unsigned long int bytesRead = 0;
unsigned long bufferlen = 0;
while(1)
{
result = read(socketFD, (char *) &bufferlen, sizeof(bufferlen));
bufferlen = ntohl(bufferlen);
recvBuf = malloc(bufferlen);
//Here client starts reading results
while(bytesread < bufferlen)
{
result = read(socketFD, recvBuf, bufferlen);
printf("recvBuf: %s\n", recvBuf);
bytesRead = strlen(recvBuf) + bytesRead;
}
free(recvBuf);
bufferlen = 0;
client_handler(); //calls Function that asks for new command
}
}
我的问题:为什么我在第一个命令后收到错误的命令值?我已经验证了 totalSize 在这两种情况下在服务器端都有正确的值并打印。一定是写/读出了问题?
我还在服务器上打印了htonl(totalSize),结果是67371008。然而客户端收到的值在 ntohl 之前是 2021093988。
最佳答案
以下代码将无法正常运行,因为您在修改字符串后再次调用了 strlen
。
token = strtok(str, "\n");
while(token != NULL)
{
token[strlen(token)] = '\n';
write(clientFD, token, strlen(token));
token = strtok(NULL, "\n");
}
为了说明,假设 str
最初是 "hello\nworld\n"
。在十六进制中是
68 65 6c 6c 6f 0A 77 6f 72 6c 64 0A 00
^---- the first newline
在 strtok
之后会是
68 65 6c 6c 6f 00 77 6f 72 6c 64 0A 00
^---- strtok changed it to a NUL
在 token[strlen(token)] = '\n'
这行之后
68 65 6c 6c 6f 0A 77 6f 72 6c 64 0A 00
^---- you changed it back to a newline
所以现在 write
中的 strlen
将返回 12,因此 write
将发送 12 个字节,而不是您期望的 6 个。这可以通过调用一次 strlen
来解决,就像这样
token = strtok(str, "\n");
while(token != NULL)
{
size_t length = strlen(token);
token[length] = '\n';
write(clientFD, token, length);
token = strtok(NULL, "\n");
}
关于c - htonl/ntohl 在第二个命令上的值不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28885714/
变量“值”是 uint32_t value = htonl(value); printf("after htonl is %ld\n\n",value); This prin
对于 AJAX 请求,我需要发送一个魔数(Magic Number)作为请求正文的前四个字节,最高有效字节在前,以及请求正文中的其他几个(非常量)值。 JavaScript 中是否有等同于 htonl
我有一个简单的问题。这段代码: int t = 1; int y = htonl(t); printf("Y = %d, sizeof(int)=%d", y, sizeof(int
我想通过套接字发送一个字符串,但不得不担心字节顺序。我知道如何解决这个问题的唯一方法是使用 htonl,但据我所知,它只适用于字符串。如何通过套接字发送字符串? 最佳答案 我认为您不必为字符串做任何事
// something proxyRequest(setRequestFormat(request), respondBuffer, gethostbyname(hostname.c_str(
我在结构中有一个 void * 值,我需要通过套接字将它发送到服务器。我知道我需要使用 int value = htonl(kv->value); 编译器报错 passing argument 1 o
我有包含以下元素的结构。此外,结构已完全填充。 typedef struct { uint16_t a; uint16_t b; uint8_t c; uint8_t
我正在尝试新的 C++ 套接字编程。我在理解 htons、htonl 和相关函数的功能时遇到了一些困难。我阅读了一些文档,但我的问题如下, 对于单个服务器和单个客户端,我在两端都使用 htons 作为
编辑:老实说,我不知道错误发生在哪里,所以我只添加大部分相关代码,不确定这是否有帮助 所以基本上我有两个基本的服务器和客户端进程。用户指定命令,客户端进程将消息长度发送给服务器,服务器执行命令并返回响
我们正在编写嵌入式应用程序代码并验证有效 IPv4 格式的字符串。我可以使用字符串分词器成功地做到这一点,但现在我需要使用 htonl() 函数将整数转换为主机到网络顺序。 因为它是一个嵌入式应用
这个问题在这里已经有了答案: Comma in C/C++ macro (8 个答案) 关闭 4 年前。 这是一个在编译时返回的异常错误,只有一些编译器参数。 使用 g++ -std=c++11 -
__builtin_bswap32() 用于反转字节(它用于 littel/big endian 问题(来自 gcc))。 htonl() 也用于反转字节(从主机到网络的转换)。 我检查了这两个函数,
我正在学习简单的套接字程序并遇到了这些,我想知道 htons 和 htonl 之间有什么区别,甚至 ntohs 和恩托尔。 最佳答案 htons 主机到网络短 ntohs 网络托管短片 htonl主机
我正在绑定(bind)到内核模块中的套接字。我从另一个套接字获取字符串格式的 IP。我应该如何将此 IP 传递给 htonl()。我尝试将其类型转换为(long int)。但是,显然它不会起作用。 如
cout << "Hello World !" << endl; 我在堆栈溢出上的第一篇文章:我们什么时候应该使用htonl函数?我已经浏览了手册页。但是,我真的不明白何时以及如何使用它。 最佳答案
我正在尝试使用 unix 套接字来测试将一些 udp 数据包发送到本地主机。 据我了解,在设置 ip 地址和端口以发送数据包时,我会将转换为网络字节顺序的值填充到我的 sockaddr_in 中。我在
我想在我的 ruby c 扩展中使用 htonl 函数,但不想使用它附带的任何其他互联网内容。 #include 中最简约但仍可移植的文件是什么?查看我计算机上的头文件,我可以看到 machine
我尝试在 Swift 中使用 htonl() 设置整数字节序,但编译器找不到 htonl() 方法。 我一直用这个作为引用:Append NSInteger to NSMutableData 这是我的
当我查找 htonl 的示例时,它总是返回一个 uint32_t。但是,当我使用 Winsock2.h 在 VS2015 中调用 htonl 时,它返回一个 u_long。 在我的机器上,当我为 32
我有如下定义: #define LOCALHOST 2130706433 在使用 sockaddr_in 时,我正在尝试更正网络/主机字节顺序: struct sockaddr_
我是一名优秀的程序员,十分优秀!