C-通过单个套接字发送多条消息-在我关闭套接字之前不会传输数据
我正在尝试从笔记本电脑到SoC板进行TCP通信,在SoC板上我发送一条消息来启动一个进程,它向我发送一系列状态消息,直到它完成进程。这意味着我将从SoC通过套接字多次调用send()。问题是我的笔记本电脑没有收到任何状态信息,除非SoC关闭了插座连接。一旦插座关闭,我就会收到SoC发送的所有数据。是否有一种方法可以使这种通信实时化,以便在它发送时立即获取状态消息 SoC上发送数据的代码:此函数被多次调用:C-通过单个套接字发送多条消息-在我关闭套接字之前不会传输数据,c,sockets,tcp,send,C,Sockets,Tcp,Send,我正在尝试从笔记本电脑到SoC板进行TCP通信,在SoC板上我发送一条消息来启动一个进程,它向我发送一系列状态消息,直到它完成进程。这意味着我将从SoC通过套接字多次调用send()。问题是我的笔记本电脑没有收到任何状态信息,除非SoC关闭了插座连接。一旦插座关闭,我就会收到SoC发送的所有数据。是否有一种方法可以使这种通信实时化,以便在它发送时立即获取状态消息 SoC上发送数据的代码:此函数被多次调用: INT16 upload(INT16* socket, INT8 HOB, INT8 LO
INT16 upload(INT16* socket, INT8 HOB, INT8 LOB, INT8 msg_type, INT8* data) {
INT8* Tx_Data= NULL;
INT8 size = 0;
INT16 num= 0;
int temp = 0;
size = 256*HOB + LOB + NAME_SIZE + 3;
Tx_Data = (INT8*) malloc(size*sizeof(INT8));
for (num=0;num<NAME_SIZE ;num++) {
Tx_Data[num] = NAME[num];
}
Tx_Data[num++] = HOB;
Tx_Data[num++] = LOB;
Tx_Data[num++] = msg_type; // 11 byte header ends here
for(temp = 0;num<size;num++,temp++) {
Tx_Data[num] = data[temp]; // data
}
send(*socket, (INT8*)Tx_Data,num,0);
return PASS;
}
在Linux中,您可以使用
fdopen
,写入并刷新流。但是,不确定它是否适用于您的情况。例如:
FILE *f = fdopen(socketdescriptor, "w+");
. . .
n = write(socketdescriptor, "this is a message", 17);
fflush(f);
...
这种行为的原因是默认情况下在套接字上启用的Nagel算法。您可以通过
setsockopt()
调用禁用它
您可以使用
fflush()
或仅在写入套接字的字符串末尾添加“\n”字符,但这将只刷新userland中的stdio缓冲区,这不是您的目标。您不能保证每次读取时都能获得11个字节。你必须在一个循环中阅读,直到你确定你有完整的请求。这可能是你的问题,也可能不是你的问题,但这没有帮助。@Duck我确信我正在发送11个字节。你发送什么并不重要。TCP会将其分解以进行传输,不管它想要什么,您发送的内容可能是您在读取中得到的,也可能不是。您必须在循环中读取数据,直到您确定得到11个字节。请查看发送
上的TCP\u节点延迟。这将迫使TCP在每次写入时发送您的11个字节,我认为,这就是您所得到的。否则,tcp可能会在缓冲区中收集send
数据,直到它认为发送数据是最佳的。这可能就是为什么你会在最后看到爆炸。然后改变读数是的我会改变读数。。我的SoC不支持TCP_节点延迟标志。send只支持一个标志,即PSH标志。两者都一样吗?如果没有,还有其他替代方法吗?这基本上就是我在笔记本电脑上做的,但我在SoC上做不到,因为它有自己的内核,称为Real-Time Zilog内核,我猜这是一个非*nix内核。如果这是OP的问题——我不确定是不是——最简单的解决方案是正确地执行读取
。换行符和fflush
应该对TCP没有影响。它将刷新stdio缓冲区,但对tcp没有意义。
FILE *f = fdopen(socketdescriptor, "w+");
. . .
n = write(socketdescriptor, "this is a message", 17);
fflush(f);
...