Exemple de calcul :
#include <stdio.h>
#include <stdint.h>
#define SIZE_TOTAL 59
#define SIZE_IPHEAD 20
#define SIZE_IPADDR 4
#define SIZE_PORT 2
uint8_t ip[SIZE_TOTAL]={
0x45,0x00,0x00,0x3b,0x2c,0xf5,0x40,0x00,0x40,0x11,0xd5,0xf7,0xac,0x1a,0x91,0x4a,
0xc1,0x30,0x39,0x30,0xdd,0x9e,0x00,0x35,0x00,0x27,0x19,0x14,0x7f,0x4a,0x01,0x00,
0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x70,0x72,0x6f,0x78,0x79,0x04,0x70,
0x6c,0x69,0x6c,0x02,0x66,0x72,0x00,0x00,0x1c,0x00,0x01
};
uint32_t checksum(uint8_t *bytes,int size,uint32_t sum,unsigned char final){
int i;
for(i=0;i<size;i += 2){
uint8_t h,l;
h=bytes[i];
l=(i<size-1)?bytes[i+1]:0;
sum += ((uint16_t)h<<8)|l;
}
if(final){
while(sum>>16) sum=(sum&0xffff)+(sum>>16);
return (~sum)&0xffff;
}
else return sum;
}
int main(void){
uint8_t *udp=ip+SIZE_IPHEAD;
uint8_t *addresses=ip+SIZE_IPHEAD-2*SIZE_IPADDR;
uint8_t protocol[]={0x00,0x11};
uint8_t *udpsize=udp+2*SIZE_PORT;
uint32_t sum=checksum(addresses,2*SIZE_IPADDR,0,0);
sum=checksum(protocol,2,sum,0);
sum=checksum(udpsize,2,sum,0);
sum=checksum(udp,SIZE_TOTAL-SIZE_IPHEAD,sum,1);
printf("%04x\n",sum);
return 0;
}