簡體   English   中英

uint32在C中的一維數組

[英]1D arrays of uint32 in C

我不斷通過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("%d\n", 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("%d\n",(unsigned int)p[i]);
    receivedCount = 0;
}
while( wantToContinueCapturingFrames );

這將持續等待數據,直到收到完整的幀為止。 收到完整的幀后,它將打印出該幀中的數據。 如果遠程系統關閉連接,它將退出而不打印任何局部框架。

對於“實際”應用程序,這實際上還不夠,因為它阻止了recv等待數據。 沒有提供(優雅地)中止而無需遠程系統發送數據或關閉連接的規定,但是解決這實際上並不是您要問的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM