Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-通过单个套接字发送多条消息-在我关闭套接字之前不会传输数据_C_Sockets_Tcp_Send - Fatal编程技术网

C-通过单个套接字发送多条消息-在我关闭套接字之前不会传输数据

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

我正在尝试从笔记本电脑到SoC板进行TCP通信,在SoC板上我发送一条消息来启动一个进程,它向我发送一系列状态消息,直到它完成进程。这意味着我将从SoC通过套接字多次调用send()。问题是我的笔记本电脑没有收到任何状态信息,除非SoC关闭了插座连接。一旦插座关闭,我就会收到SoC发送的所有数据。是否有一种方法可以使这种通信实时化,以便在它发送时立即获取状态消息

SoC上发送数据的代码:此函数被多次调用:

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);
...