Unix Programming - problem with sendto and raw sockets

This is Interesting: Free IT Magazines  
Home > Archive > Unix Programming > October 2005 > problem with sendto and raw sockets





You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

Author problem with sendto and raw sockets
Fernando Barsoba

2005-10-25, 2:49 am

Hi all,

I'm stuck trying to send an IP header through raw sockets. I'm using
Eclipse and cygwin.. but I have been told that raw sockets should work
with cygwin..

The error that I get back is: Cannot assign requested address.

Here's my code. I have been trying with this implementation using raw
sockets and I have the same problem -> http://www.whitefang.com/rin/
(rawsock-05)

Any help appreciated.. i'm stuck with this thing..

FBM

ipsec_v4.c-------------

#include "ipsec_v4.h"
#include <stdio.h>
#include <stdlib.h>

#define IP_VERSION 4
#define LEN 512

struct ip * build_ip_packet() {
struct ip *iphdr;
int packet_size;
char *packet;
struct in_addr ipsrc_addr, ipdst_addr;
const char *host = "192.168.2.3";
const char *dest = "192.168.2.2";

packet_size = sizeof(struct ip);
packet = malloc(packet_size);
bzero(packet, packet_size);
iphdr = (struct ip *)packet;

inet_aton(host, &ipsrc_addr);
inet_aton(dest, &ipdst_addr);

iphdr->ip_v = 4;
iphdr->ip_hl = 5;
iphdr->ip_tos = 0;
iphdr->ip_len = 0x1400;
iphdr->ip_id = 0;
iphdr->ip_off = 0;
iphdr->ip_ttl = 64;
iphdr->ip_p = 51;
iphdr->ip_src = ipsrc_addr;
iphdr->ip_dst = ipdst_addr;
iphdr->ip_sum = 0;

iphdr->ip_sum = in_cksum((u_short *) iphdr, (iphdr->ip_hl) << 2);

return iphdr;
}

int main(int argc, char **argv) {
int s, port;
struct ip *ip_datagram;
const int on = 1;
struct sockaddr_in sin;
char host[LEN];
struct hostent *hp;

hp = gethostbyname(argv[1]);
if ( hp == NULL ) {
fprintf(stderr, "%s: host not found (%s)\n", argv[0], host);
exit(1);
}
port = atoi("5555");

s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
sin.sin_family = AF_INET;
sin.sin_port = htons(port);
memcpy(&sin.sin_addr, hp->h_addr_list[0], hp->h_length);

ip_datagram = build_ip_packet();

if (setsockopt(s, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0) {
perror("setsockopt:");
exit(s);
}
ssize_t returned;
returned = sendto(s, ip_datagram, 20, 0, (struct sockaddr *) &sin,
sizeof(sin));
if (returned < 0) {
perror("sendto");
exit(1);
}
exit(0);
}

checksum.c --------

#include <sys/types.h>
#include <netinet/in.h>

uint16_t in_cksum (uint16_t * addr, int len) {
int nleft = len;
uint32_t sum = 0;
uint16_t *w = addr;
uint16_t answer = 0;

/*
* Our algorithm is simple, using a 32 bit accumulator (sum), we add
* sequential 16 bit words to it, and at the end, fold back all the
* carry bits from the top 16 bits into the lower 16 bits.
*/
while (nleft > 1) {
sum += ntohs(*w++);
nleft -= 2;
}
/* mop up an odd byte, if necessary */
if (nleft == 1) { /* ntohs shoudl be added here too.. to do!
* (unsigned char *) (&answer) = * (unsigned char *) w;
sum += answer;
}

/* add back carry outs from top 16 bits to low 16 bits */
sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */
sum += (sum >> 16); /* add carry */
answer = ~sum; /* truncate to 16 bits */
return (answer);
}
Sponsored Links






Free braindumps | Software forum | Database administration forum

Copyright 2003 - 2008 webservertalk.com