ping ツールを使用していますが、45041 以上のパケット サイズ (ICMP ヘッダーを含む) を使用すると、ICMP チェックサムを計算しているときに、送信バッファーの周りでアクセス違反が常に発生します。サイズが 45040 以下のパケットはエラーをスローせず、正しいチェックサムで適切に送信されます。省略されたコードは以下のとおりです。アクセス違反は、最初の反復でチェックサム関数の while ループ内でバッファを逆参照するときに発生します。
typedef struct ICMPHeader
{
BYTE type; // ICMP packet type
BYTE code; // Type sub code
USHORT checksum;
USHORT id;
USHORT seq;
} ICMPHeader;
typedef struct echoRequest
{
ICMPHeader icmpHead;
char *data;
} EchoRequest;
// ...
EchoRequest *sendBuffer = new EchoRequest();
sendBuffer->data = new char[packetSize];
memset((void *)sendBuffer->data, 0xfa, packetSize);
sendBuffer->icmpHead.checksum = ipChecksum((USHORT *)sendBuffer,
packetSize + sizeof(sendBuffer->icmpHead));
// ...
// checksum function
USHORT ipChecksum(USHORT *buffer, unsigned long size)
{
unsigned long cksum = 0;
while (size > 1)
{
cksum += *buffer++;
size -= sizeof(USHORT);
}
if (size)
cksum += *(UCHAR *)buffer;
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >> 16);
return (USHORT)(~cksum);
}
なぜこれが起こっているのかについてのアイデアはありますか?
正確なエラー文言:Unhandled exception at 0x009C2582 in PingProject.exe: 0xC0000005: Access violation reading location 0x004D5000.
.NET 4.0 用のプラットフォーム ツールセット v100 で Visual Studio Professional 2012 を使用する