c - sending ip packet down the wire throws "Invalid argument" -


i implementing trivial icmp ping in sending ip packet down wire giving me "invalid argument".

here's code:

 /* create ip packet */ int packet_size = ipv4_hdrlen + (int)sizeof(icmpheader) + (int)[payload length]; char *packet = (char *) malloc (packet_size);  if (!packet) {     perror("out of memory");     return; }  //zero out packet buffer memset (packet, 0, packet_size);  //ip header struct ip *iphdr = (struct ip *) packet; iphdr->ip_v = 4; iphdr->ip_hl = 5; iphdr->ip_tos = 0; iphdr->ip_len = htons(packet_size); iphdr->ip_id = (ushort) rand(); iphdr->ip_off = 0; iphdr->ip_ttl = 255; iphdr->ip_p = ipproto_icmp; iphdr->ip_sum = in_cksum((uint16_t *)iphdr, ipv4_hdrlen);  int status = 0; char *src_ip = (char *) [@"127.0.0.1" utf8string]; char *dst_ip = (char *) [@"2.3.4.5" utf8string];  // source ipv4 address (32 bits) if ((status = inet_pton (af_inet, src_ip, &(iphdr->ip_src))) != 1) {     fprintf (stderr, "inet_pton() failed.\nerror message: %s", strerror (status));     exit (exit_failure); }  // destination ipv4 address (32 bits) if ((status = inet_pton (af_inet, dst_ip, &(iphdr->ip_dst))) != 1) {     fprintf (stderr, "inet_pton() failed.\nerror message: %s", strerror (status));     exit (exit_failure); }  icmppacket = [nsmutabledata datawithlength:sizeof(*icmpptr) + [payload length]]; assert(icmppacket != nil);  icmpptr = [icmppacket mutablebytes]; icmpptr->type = kicmptypeechorequest; icmpptr->code = 0; icmpptr->checksum = 0; icmpptr->identifier     = osswaphosttobigint16(self.identifier); icmpptr->sequencenumber = osswaphosttobigint16(self.nextsequencenumber); memcpy(&icmpptr[1], [payload bytes], [payload length]);  icmpptr->checksum = in_cksum([icmppacket bytes], [icmppacket length]); int on = 1;  /* copy icmp , data packet */ memcpy(packet + ipv4_hdrlen, icmpptr, [icmppacket length]);  // set flag socket expects provide ipv4 header. if (setsockopt (cfsocketgetnative(self->_socket), ipproto_ip, ip_hdrincl, &on, sizeof (on)) < 0) {     perror ("setsockopt() failed set ip_hdrincl ");     exit (exit_failure); }  /* send packet */  if (self->_socket == null) {     bytessent = -1;     err = ebadf; } else {     bytessent = sendto(         cfsocketgetnative(self->_socket),         packet,         packet_size,         0,          (struct sockaddr *) &sin,          sizeof (struct sockaddr)     );     err = 0;     if (bytessent < 0) {         err = errno;     } } 

this extension apple's simple ping: https://developer.apple.com/library/mac/samplecode/simpleping/listings/simpleping_m.html#//apple_ref/doc/uid/dts10000716-simpleping_m-dontlinkelementid_5

ip packet that's being framed looks straight forward reason, it's giving errno 22. not sure else wrong code.

socket created using:

fd = socket(af_inet, sock_dgram, ipproto_icmp); 

i cannot use raw sockets building ios app.

thanks

in case encounters same issue, problem it's mentioned in post: raw socket sendto() failure in os x


Comments

Popular posts from this blog

node.js - Mongoose: Cast to ObjectId failed for value on newly created object after setting the value -

gradle error "Cannot convert the provided notation to a File or URI" -

python - NameError: name 'subprocess' is not defined -