- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个连接到本地网络的 MCU 单元。该设备每秒通过 TCP 套接字发送其状态数据 100 次。通过同一个套接字,我还可以发出命令和数据。
我正在尝试编写一个简单的 TCP 客户端,它可以连接到设备、抓取数据并根据请求发送命令。目前我可以毫无问题地发送命令(命令作为字符串发送,这有效)。我的问题是从设备接收数据。
我从设备手册中知道数据应该首先是一个 32 位整数,然后是大约 30 个 double 的数组)
我正在建立一个新线程,我想连续拦截数据并处理它:
void *com::setListenerSocket(void* threadSocketData) {
struct socketData *sockData;
sockData = (socketData*)threadSocketData;
com::tcp_client cListener;
struct timeval timeout;
timeout.tv_sec=0;
timeout.tv_usec=12500;
// setsockopt(cListener, IPPROTO_TCP, SO_RCVTIMEO, (char *)timeout, sizeof(timeout)); //no effect
cListener.connect(sockData->host , sockData->port);
cout << "listener thread started" << endl;
cout << "host=" << sockData->host << " at port=" << sockData->port << endl;
cListener.send_data("Listener Reporting\n");
while(listenerRun){
listenerHB++;
cout << endl <<"***************************** BGN *************************************************************"<< endl;
char *received = new char[PACKETSIZE];
cListener.receive(PACKETSIZE, received);
unsigned int test;
test = (uint32_t) received;
cout << "received=" << test << endl;
for(int i = 0; i< PACKETSIZE ; ++i)
cout << received[i] << ", ";
cout << endl <<"***************************** END *********************************************"<< endl;
robotPacket data;
//parseData(received, &data);
//usleep(1 MS);
}
cout << "listener signing out" << endl;;
pthread_exit(NULL);
}
监听器方法是:
void com::tcp_client::receive(int size, char* buffer) {
unsigned int bytecnt = 0, archive = 1;
while(bytecnt < (unsigned int)size) {
// bytecnt += recv(sock , &buffer[bytecnt] , size-bytecnt , 0);
bytecnt += recv(sock , buffer , size-bytecnt , MSG_WAITALL);
}
unsigned int test;
test = buffer[0];
cout << "value=" << test << "¤" << endl;
}
我将指针指向缓冲区的开头并将其转换为uint32_t,但结果完全错误(我知道它应该是数据包长度,但它很容易变成数百万)
当我使用 nl 命令时:nc -l 12354 我可以向程序写入文本,一切都正确
编辑:与更有经验的人会面:已解决:我自己无法发布解决方案,因此我会将其放在这里,以防有人遇到类似问题。
首先,我希望套接字能够自动处理单个传输的开始位置和结束位置 - 正如 Basyle Starynkevitch 指出的那样,这不是真的。然而,TCP 确保数据按顺序传入并且不会丢失任何内容,因此我可以放心地假设对于 promise 的 500 字节,我将获得该 500 字节或其他任何内容。
其次,数据以大尾数法输入 - 也正如 Basyle 所指出的那样。我做了一些位移,但仍然得到了错误的结果,但是......
最后,我在类型转换方面遇到了另一个问题。我使用的是 char* 而数据是无符号字符。将缓冲区 char* 替换为 unsigned char* 解决了解码问题。
对于任何想要与通过局域网进行通信的旧电子设备进行交互的人来说,这都是一个解决方案。
我想如果有人以简洁的形式发布我上面写的内容,这个案子就可以被认为结束了。
最佳答案
您可能想查看 tcpclient ( http://cr.yp.to/ucspi-tcp/tcpclient.html )。您可以简单地在 tcpclient 下运行 C/C++ 程序 - 即 tcpclient 将生成您的程序并打开到服务器的 tcp 连接,并将程序的标准输出通过管道传输到服务器,并将服务器的输出通过管道传输到程序的标准输入。这样做的好处是,您可以让 tcpclient 承担所有繁重的工作,例如设置套接字等,并且您可以专注于程序的核心功能。
关于c++ - 在C++中通过套接字接收二进制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21827065/
我正在尝试将谷歌地图集成到 Xamarin Android。但是,如标题中所写,收到错误。此错误出现在我的 SetContentView (Resource.Layout.Main); 上,如下所示:
在 Delphi 中如何以非文本模式打开二进制文件?类似于 C 函数 fopen(filename,"rb") 最佳答案 有几个选项。 1。使用文件流 var Stream: TFileStrea
我现在正在处理一个问题,如下所示: 有两个数字 x1 和 x2 并且 x2 > x1。 例如 x1 = 5; x2 = 10; 而且我必须在二进制表示中找到 x1 和 x2 之间的总和。 5 = 10
我有这个“程序集”文件(仅包含 directives ) // declare protected region as somewhere within the stack .equiv prot_s
有没有办法在powershell中确定指定的文件是否包含指定的字节数组(在任何位置)? 就像是: fgrep --binary-files=binary "$data" "$filepath" 当然,
我是一名工程师,而不是软件程序员,所以请原谅我的无知。 我编写了一个 Delphi(7SE) 程序,用于从连接到两个数字温度计的 USB 端口读取“真实”数据类型。 我已经完成了该计划的大部分内容。
我有一些代码,例如: u=(float *)calloc(n, sizeof(float)); for(i=1; i
typedef struct pixel_type { unsigned char r; unsigned char g; unsigned char b;
如何判断二进制数是否为负数? 目前我有下面的代码。它可以很好地转换为二进制文件。转换为十进制时,我需要知道最左边的位是否为 1 以判断它是否为负数,但我似乎无法弄清楚该怎么做。 此外,我如何才能让它返
我有一个带有适当重载的 Vect*float 运算符的 vector 类,我正在尝试创建全局/非成员 float*Vect 运算符,如下所示:(注意这是一个经过大量编辑的示例) class Vect
对于使用 C 编程的项目,我们正在尝试将图像转换为二进制数据,反之亦然。我们在网上找到的所有其他解决方案都是用 C++ 或 Java 编写的。这是我们尝试过的方法: 将图像转换为包含二进制数据的文本文
我需要对列表的元素求和,其中包含所有零或一,如果列表中有 1,则结果为 1,否则为 0。 def binary_search(l, low=0,high=-1): if not l: retu
我到处搜索以找到将 float 转换为八进制或二进制的方法。我知道 float.hex 和 float.fromhex。是否有模块可以对八进制/二进制值执行相同的工作? 例如:我有一个 float 1
当我阅读有关 list.h 文件中的 hlist 的 FreeBSD 源代码时,我对这个宏感到困惑: #define hlist_for_each_entry_safe(tp, p, n, head,
我不知道出了什么问题,也不知道为什么会出现此错误。我四处搜索,但我终究无法弄明白。 void print_arb_base(unsigned int n, unsigned int b) {
在任何语言中都可以轻松地将十进制转换为二进制,反之亦然,但我需要一个稍微复杂一点的函数。 给定一个十进制数和一个二进制位,我需要知道二进制位是开还是关(真或假)。 示例: IsBitTrue(30,1
在下面的代码中,我创建了两个文件,一个是文本格式,另一个是二进制格式。文件的图标显示相同。但是这两个文件的特征完全相同,包括大小、字符集(==二进制)和流(八位字节)。为什么没有文本文件?因为如果我明
我想通读一个二进制文件。谷歌搜索“python binary eof”引导我here . 现在,问题: 为什么容器(SO 答案中的 x)不包含单个(当前)字节而是包含一大堆字节?我做错了什么? 如果应
为什么只允许以 10 为基数使用小数点?为什么以下会引发语法错误? 0b1011101.1101 我输入的数字是否有歧义?除了 93.8125 之外,字符串似乎没有其他可能的数字 同样的问题也适用于其
boost 库中有二进制之类的东西吗?例如我想写: binary a; 我很惭愧地承认我曾尝试找到它(Google、Boost)但没有结果。他们提到了一些关于 binary_int<> 的内容,但我既
我是一名优秀的程序员,十分优秀!