C 中 uint32 的一维数组



我 通过 TCP/IP 不断 将 像素 值 (160x120) 数组 作为 字节 流 从 LabVIEW 发送 到 C 程序。然后,我将字节转换为 uint32 值,并在控制台应用程序中打印接收到的数据。这里的目标是,我想将接收到的数据划分为一维数组,因此每个一维数组都将由 (160x120=19200) 整数值组成,因此它表示一个帧。换句话说,数组必须收集接收数据的每 19200 个整数,并将它们显示在控制台应用程序中。然后,同一数组必须收集下一个 19200 个整数,并在控制台应用程序中显示它们,依此类推。如果有人展示如何做到这一点,我将不胜感激。

WSADATA wsa;
SOCKET s , new_socket;
struct sockaddr_in server , client;
int c;
int iResult;
char recvbuf[DEFAULT_BUFLEN];
int recvbuflen = DEFAULT_BUFLEN;
typedef unsigned int uint32_t;
unsigned int i;
size_t len;
uint32_t* p;
uint32_t value;
p = (uint32_t*)((void*)recvbuf);
do
{
    iResult = recv(new_socket, recvbuf, recvbuflen, 0);
    len = iResult/sizeof(uint32_t);
    for(i=0; i < len; i++)
    {
    value = p[i];
    }
    printf("%dn", value);
} 
while ( iResult > 0 );
closesocket(new_socket);
WSACleanup();
return 0;

这段代码对事物的大小和对齐方式做出了许多假设。 在 x86 系统上,这将正常工作,但要注意需要对齐的系统。 它还假设两个系统具有相同的终结性。

要接收分块为 160x120 uint32_t 字节区块的数据(假设您的DEFAULT_BUFLEN正确):

int receivedCount = 0;
do
{
    iResult = recv( new_socket, 
                    &recvbuf[receivedCount],
                    DEFAULT_BUFLEN-receivedCount,
                    0 );
    if ( iResult == 0 ) break;    //0 == socket closed
    receivedCount += iResult;
    if ( receivedCount < DEFAULT_BUFLEN )
        continue;                 //still receiving full frame
    for(int i=0; i<160*120; i++)
        printf("%dn",(unsigned int)p[i]);
    receivedCount = 0;
}
while( wantToContinueCapturingFrames );

这将持续等待数据,直到收到完整帧。 收到整帧后,它将从帧中打印出数据。 如果远程系统关闭连接,这将退出而不打印任何部分帧。

这对于"真正的"应用程序来说还不够,因为它在等待数据的 recv 中阻塞。 没有规定在没有远程系统发送数据或关闭连接的情况下(优雅地)中止,但修复它并不是您在这里真正要求的内容。

最新更新