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

时间:2014-10-13 11:54:11

标签: c sockets tcp send

我正在尝试从我的笔记本电脑到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);
        }

2 个答案:

答案 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缓冲区,这不是你的目标。