c - 框成一个大的一维数组

标签 c sockets winsock

我正在通过 TCP 从 LabVIEW 向这个 C 程序发送一个灰度帧 (160x120)。我设法将字节转换为 uint32 像素值。这里的目标是我将每 19203 个字节定义为一个图像数组,其中第一个字节是定义数组 ID 的 header ,第二个和第三个字节定义分辨率(120 和 160),最后 19200 个字节是从 LabVIEW 程序接收字节。目的是第一个数组的第一个字节将获得值“1”,第二个数组的第一个字节将获得值“2”,依此类推。

当我检查 19203 字节时,就会出现这种情况的问题。我可以清楚地看到每个 uint32 值似乎都是正确的,直到值 4801。从该值到 19203,我得到一个恒定的奇怪值:“3435973836”,与灰度像素无关,因为它只能在 0 和300.错误发生在哪里?。

Result

#define DEFAULT_BUFLEN 19203

int main(int argc , char *argv[])
{
    WSADATA wsa;
    SOCKET s , new_socket;
    struct sockaddr_in server , client;
    int c;
    int iResult;
    int receivedCount = 0;
    char recvbuf[DEFAULT_BUFLEN];
    int recvbuflen = DEFAULT_BUFLEN;
    typedef unsigned int uint8_t;
    unsigned long totalReceived = 0, totalExpected=160*120;
    unsigned int i;
    uint32_t image[DEFAULT_BUFLEN]; 
    size_t len;
    uint8_t* p;
    uint8_t value;
    int x=0;
    int z=0;

    p = (uint8_t*)recvbuf;

    do
    {
        iResult = recv( new_socket, recvbuf, recvbuflen, 0);
        for(z=1; z<11; z++)
        {
            image[0] = z;

            for(i=0, x=1; i<19202,x<19203; i++, x++)
            {
                image [x] = p[i];
                printf("%lu\n",image[x]);
            }
        }   
    }
    while(iResult > 0 );

    closesocket(new_socket);
    WSACleanup();

    return 0;
}

最佳答案

recv() 可能不一定读取您请求的所有字节——它返回的字节数可能少于您请求的字节数。您需要始终检查 recv() 的返回值,并且只处理那么多字节。通过忽略返回值,您正在读取未初始化的内存。

数字 3435973836 在十六进制中更能说明问题 -- 它是 0xcccccccc。这magic number Visual Studio 运行时使用它来初始化调试版本中的堆栈内存,因此当您看到该值时,您就知道您正在读取未初始化的堆栈内存。

关于c - 框成一个大的一维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21055766/

相关文章:

c - 使用 wsprintf 换行

c - c中的种子随机数

c++ - 为什么要使用非阻塞或阻塞套接字?

java - Eclipse "Show Proposal"组合键不适用于 Java 或 C

c - Visual Studio 2010 C++ 意外的命令行参数

java - 使用 flex socket 读取 AMF 对象

java - 获取主机IP地址

c - 在 systemd.Netstat 运行的网络服务器中调用 Accept() 后,不显示我的服务

C++ 奇怪的 memcpy 行为

c++ - Text和Bin Buffer如何设置WSABUF.buf?