我正在尝试从我的笔记本电脑到SoC板进行TCP通信,在那里我发送一条消息来启动进程,它向我发送一系列状态消息,直到它完成该过程。这意味着我将通过套接字从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;
}
我的笔记本电脑上的代码:
for(;;) {
printf("Start of for loop socket id: %d \n",socket_id);
RX_Data = (unsigned char*)malloc(2048);
unsigned char Command;
int No_of_Data_Bytes=0;
printf("Before read.... \n");
nbytes = read(socket_id,RX_Data,11); // get 11 bytes from EZ80
printf("Received %d bytes from socket\n",nbytes);
No_of_Data_Bytes = RX_Data[8]*256 + RX_Data[9];
Command = RX_Data[10];
printf("\n command:%c %d \n",Command,No_of_Data_Bytes);
if(Command=='I' || Command=='E'|| Command=='V') {
//read and analyse data
}
else {
break;
}
Command = '\0';
free(RX_Data);
}
答案 0 :(得分:1)
在Linux中,您可以使用fdopen
,编写并刷新流。但不确定它是否适用于您的情况。例如:
FILE *f = fdopen(socketdescriptor, "w+");
. . .
n = write(socketdescriptor, "this is a message", 17);
fflush(f);
...
答案 1 :(得分:0)
此行为的原因是默认情况下在套接字上启用了Nagel算法。您可以通过setsockopt()
电话将其停用。
您可以使用fflush()
或只是添加&#39; \ n&#39;字符串写入套接字的字符串末尾,但这只会刷新userland中的stdio缓冲区,这不是你的目标。