Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 帧到一个大的一维数组中_C_Sockets_Winsock - Fatal编程技术网

C 帧到一个大的一维数组中

C 帧到一个大的一维数组中,c,sockets,winsock,C,Sockets,Winsock,我正在通过TCP从LabVIEW向这个C程序发送一个灰度帧(160x120)。我设法将字节转换成uint32像素值。这里的目标是,我将每19203个字节定义为一个图像数组,其中第一个字节是定义数组ID的头,第二个和第三个字节定义分辨率(120和160),最后19200个字节是从LabVIEW程序接收的字节。目的是第一个数组的第一个字节将获得值“1”,第二个数组的第一个字节将获得值“2”,依此类推 本例中的问题发生在检查19203字节时。我可以清楚地看到,在值4801之前,每个uint32值似乎都

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

本例中的问题发生在检查19203字节时。我可以清楚地看到,在值4801之前,每个uint32值似乎都是正确的。从这个值到19203年,我得到一个恒定的奇怪值:“3435973836”,它和灰度像素无关,因为它只能在0到300之间。错误发生在哪里

#定义默认值_buflen19203
int main(int argc,char*argv[])
{
WSADATA wsa;
插座s,新的_插座;
服务器、客户端中的结构sockaddr_;
INTC;
国际结果;
int receivedCount=0;
char recvbuf[默认值];
int recvbuflen=默认值;
typedef unsigned int uint8_t;
无符号长时间totalReceived=0,totalExpected=160*120;
无符号整数i;
uint32_t图像[默认值];
尺寸透镜;
uint8_t*p;
uint8_t值;
int x=0;
int z=0;
p=(uint8_t*)recvbuf;
做
{
iResult=recv(新的_套接字,recvbuf,recvbuflen,0);
for(z=1;z
recv()
可能不一定要读取您要求它读取的所有字节——它返回的字节可能比您要求的少。您需要始终检查
recv()
的返回值,并且只处理这么多字节。忽略返回值,就是读取未初始化的内存


数字3435973836在十六进制中更为清晰——它是0xCCCC。Visual Studio运行时使用它在调试版本中初始化堆栈内存,因此当您看到该值时,您就知道您正在读取未初始化的堆栈内存。

检查默认的BUFLEN大小,因为我在代码中看不到它的声明。这可能是原因g缓冲区溢出,因为数组映像[]在声明时将其用作参数。

您的缓冲区长度为
19203
字节,但您正在使用uint32对其进行迭代,因此每次4个字节:

uint32_t image[DEFAULT_BUFLEN]; 
[...]
for(i=0, x=1; i<19202,x<19203; i++, x++)
{
    image [x] = [...];

// sizeof(uint32) == 4

另一个要考虑的是条件<代码>感谢亚当的回复。你有任何编码建议来处理这个问题吗?抱歉。我只是在回复之前没有添加它。所以我必须在代码的顶部声明这两行。@ USE229 2615,你不应该尝试读取<代码>图像[4800 ]。

或任何更高版本的索引,当
image
uint32
的数组时。该uint32值实际上是一个错误。它应该是uint_8。但它不会改变任何东西?@user2292615这行是相关的:
uint32_t image[DEFAULT_BUFLEN];
——为了举例说明,假设您做了
image[1]=0
--您知道缓冲区的哪些字节将被归零吗?我实际上将DEFAULT_BUFLEN的大小增加了因子4,所以看起来现在一切都正常了。根据您的问题,答案是“否”。
uint32_t image[DEFAULT_BUFLEN]; 
[...]
for(i=0, x=1; i<19202,x<19203; i++, x++)
{
    image [x] = [...];

// sizeof(uint32) == 4
sizeof(uint32) * 4801 == 19204
using image[4801] is undefined behaviour, even image[4800] is ub