Bonjours tlm
j'ai quelque petit problème je crée mon packet udp tout est bon saufe le checksum pouvez vous m'aider voici mon code:
#define PORT 521
#define buffer_size 2//5120
#define IP "192.168.2.1"
typedef struct udphdr
{
unsigned short srcport;
unsigned short dstport;
unsigned short length;
unsigned short checksum;
} UDP_HDR;
unsigned short in_cksum(u_short * addr, int len)
{
register int nleft = len;
register u_short *w = addr;
register int sum = 0;
u_short answer = 0;
while (nleft > 1) {
sum += *w++;
nleft -= 2;
}
if (nleft == 1) {
*(u_char *) (&answer) = *(u_char *) w;
sum += answer;
}
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
answer = ~sum;
return (answer);
}
int main(int argc, char *argv[]){
unsigned short sizeofPacket;
char *packet = NULL, *ptr = NULL;
int len_sin;
SOCKET sock;
SOCKADDR_IN sin;
WSADATA data;
struct udphdr *udp;
if( (WSAStartup(MAKEWORD(2,0), &data)) != 0)
winsock_err(1);
if ((sock = socket(AF_INET, SOCK_RAW, IPPROTO_UDP))==INVALID_SOCKET )
winsock_err(1);
sizeofPacket = sizeof(struct udphdr); // sizeof(struct iphdr) +
udp = (struct udphdr *) malloc(sizeof(struct udphdr));
memset(udp, 0x0, sizeof(struct udphdr));
udp->srcport = htons(48605); //port source
udp->dstport = htons(521); //port dest
udp->length = htons(sizeof(struct udphdr));
udp->checksum = 0;
udp->checksum = in_cksum((unsigned short *) udp, sizeof(struct udphdr));
packet = (char *) malloc(sizeofPacket);
memset(packet, 0x0, sizeofPacket);
ZeroMemory(packet, sizeofPacket);
ptr = packet;
memcpy(ptr, udp, sizeof(struct udphdr));
ptr += sizeof(struct udphdr);
sin.sin_addr.s_addr=inet_addr(IP);
sin.sin_port=htons(PORT);
sin.sin_family=AF_INET;
len_sin=sizeof(sin);
if (sendto(sock, packet, sizeofPacket, 0x0, (struct sockaddr *) &sin,len_sin) == SOCKET_ERROR)
winsock_err(1);
closesocket(sock);
WSACleanup();
system("PAUSE");
return 0;
}
POUVEZ VOUS ->m'aider?
____
www.sebastien-metthez.com
le problème vient souvent de l'interface chaise clavier.