Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com Date: Mon, 24 Oct 2005 23:37:03 -0400 From: Fernando Barsoba Subject: problem with sendto and raw sockets To: cygwin AT cygwin DOT com Message-id: <435DA85F.20305@verizon.net> MIME-version: 1.0 Content-type: text/plain; charset=ISO-8859-1; format=flowed Content-transfer-encoding: 7bit User-Agent: Mozilla Thunderbird 1.0.2 (Windows/20050317) X-IsSubscribed: yes 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.. I got the definition for IP_HDRINCL from the last snapshot. I only got the socket.h header file from the snapshot... and not the whole thing. I have been able to build the program, but I am not sure if using only the socket.h could be the problem... 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 #include #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 #include 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); } -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Problem reports: http://cygwin.com/problems.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/