系统配置:Win XP (i7 2.1 Ghz) 外置 USB 网卡。通讯:主从通讯。约束 - 通信协议 UDP。
套接字配置:RecvFrom - 非阻塞。使用 setsockopt 将套接字大小更改为 1*1024*1024。
我的设置包括一个通过 UDP 与主节点通信的节点,它在 UDP 帧的有效负载中发送分段数据。该分段数据由每个以太网帧 5 个帧组成。从节点向主节点发送 1270 字节的分片数据。从站在不到 2 毫秒的时间内发送 18 - 20 帧。
主机周期性地接收这些帧而不丢弃它们。然而,来自 UDP 帧的有效载荷数据随机包含 2 个正确片段,其余 3 个片段是垃圾值。我在 smae 片段中观察到了 wireshark 上的痕迹,可以观察到正确的数据,但是 recvfrom API 如何在这 3 个片段中收集垃圾数据。看起来实际信息是如何被这个垃圾值替换的。当我将数据包数量减少到每 2 毫秒 2-3 个时,这种行为就会下降。
从控制台跟踪:
_recvBuf[2]: 0x5b _recvBuf[256}: 0x5c _recvBuf[510]: 0x5d
_recvBuf[764}: 0x5e _recvBuf[1018}: 0x5f
_recvBuf[2]: 0x60 _recvBuf[256}: 0x61 _recvBuf[510]: 0x64
_recvBuf[764}: 0x0 _recvBuf[1018}: 0x0
Expected and as in the Wireshark trace:
_recvBuf[510]: 0x64 --> should be _recvBuf[510]: 0x62
_recvBuf[764}: 0x0 --> should be _recvBuf[510]: 0x63
_recvBuf[1018}: 0x0 --> should be _recvBuf[510]: 0x64
并且垃圾值经常重复到 0xcd,用于随机数据包编号。
!!!数据包 200 - 错误!!!数据包 20000 - 错误!!!数据包 60000 - 错误!!!数据包 2 - 错误
我无法理解为什么会出现这种行为。
代码:
receive()
{
rc = select(_sock_fd+1, &read_fd, &write_fd, &excep_fd, &to);
if (rc == 0 )
acess = 1;
else if (rc == SOCKET_ERROR)
{
closesocket(_sock_fd);
return -1;
}
else
{
if (!FD_ISSET(_sock_fd, &read_fd))
{
LogError("XCP: select() wrong socket descr");
return -1;
}
else
{
rc = recvfrom(_sock_fd, (char *)_recvBuf, UDP_RECVBUFLEN, 0, (LPSOCKADDR)&_saddr, &cli_alen);
printf("_recvBuf[3]: 0x%x _recvBuf[2]: 0x%x _recvBuf[256}: 0x%x _recvBuf[510]: 0x%x _recvBuf[764}: 0x%x _recvBuf[1018}: 0x%x\n",_recvBuf[3],_recvBuf[2],_recvBuf[256],_recvBuf[510],_recvBuf[764],_recvBuf[1018]);
_recvBuf[*(&rc)]='\0';
if(rc == SOCKET_ERROR)
{
closesocket(_sock_fd);
return -1;
}
_recvBufLen = rc;
if (_recvBufLen > 0)
{
int rc = 0;
acess = 0;
if (_rxNotification != NULL)
_rxNotification(_parent, _xhdl, _recvBuf, _recvBufLen);
RxbufferLen=*(u16*)&_recvBufLen;
/* Proto RX Queue Implementation Start */
if(!(Fullqueue(Rxbufferqueue)))
Enqueue(Rxbufferqueue,_recvBuf);
if(_recvBuf[4]==0xff)
acess = 1;
else
acess = 0;
return rc;
}
else
return 0;
}
}
有关函数的附加信息:
void XcpTransportUdp::Enqueue (Queuetype &queue, unsigned char buf[MAX_BUFFER_SIZE_QUEUE],u16 _recvBufLen) // Push Function for Queue
{
Rxbufferqueue.BackPointer=(Rxbufferqueue.BackPointer+1)%MAX_BUFFER_IN_QUEUE;
Rxbufferqueue.Recv_length[Rxbufferqueue.BackPointer]=_recvBufLen;
memcpy(Rxbufferqueue.Buffer[Rxbufferqueue.BackPointer],buf,Rxbufferqueue.Recv_length[Rxbufferqueue.BackPointer]);
}
u16 XcpTransportUdp::Dequeue (Queuetype &queue, unsigned char Output_buffer[MAX_BUFFER_SIZE_QUEUE]) // Pop Function for Queue
{
Rxbufferqueue.Frontpointer =(Rxbufferqueue.Frontpointer+1)%MAX_BUFFER_IN_QUEUE;
BufLen=Rxbufferqueue.Recv_length[Rxbufferqueue.Frontpointer];
memcpy(Output_buffer,Rxbufferqueue.Buffer[Rxbufferqueue.Frontpointer],Rxbufferqueue.Recv_length[Rxbufferqueue.Frontpointer]);
return BufLen;
}
:::Edir1::: 我发现错误与内存初始化有关,而不是与套接字有关。enqueue函数中的memcpy函数报长度为0cCD的错误。有谁知道这个问题的解决方案..?