I haven't been following this message thread but I figured that this had
to be either a broadcast frame or a multicast frame.
Here is a snippet from the rfc and it clearly points out that the router
advertisements are sent to a either a multi-cast or a broadcast
(multicast preferred) and is what is probably being used. Unless you
join the multicast group for that address you'll never receive any icmp
packets. The :
The ICMP router discovery messages are called "Router Advertisements"
and "Router Solicitations". Each router periodically multicasts a
Router Advertisement from each of its multicast interfaces,
announcing the IP address(es) of that interface. Hosts discover the
addresses of their neighboring routers simply by listening for
advertisements. When a host attached to a multicast link starts up,
it may multicast a Router Solicitation to ask for immediate
advertisements, rather than waiting for the next periodic ones to
arrive; if (and only if) no advertisements are forthcoming, the host
may retransmit the solicitation a small number of times, but then
must desist from sending any more solicitations. Any routers that
subsequently start up, or that were not discovered because of packet
loss or temporary link partitioning, are eventually discovered by
reception of their periodic (unsolicited) advertisements. (Links
that suffer high packet loss rates or frequent partitioning are
accommodated by increasing the rate of advertisements, rather than
increasing the number of solicitations that hosts are permitted to
send.)
AdvertisementAddress
The IP destination address to be used for multicast
Router Advertisements sent from the interface. The
only permissible values are the all-systems multicast
address, 224.0.0.1, or the limited-broadcast address,
255.255.255.255. (The all-systems address is preferred
wherever possible, i.e., on any link where all
listening hosts support IP multicast.)
Default: 224.0.0.1 if the router supports IP multicast
on the interface, else 255.255.255.255
I also tracked down some sample code for the multicast server and
multicast client. This below code was copied from http://
www.tack.ch/multicast/ :
This is a sample multicast server without error handling
Comments on code
----------- cut here ------------------
// Multicast Server
// written for LINUX
// Version 0.0.2
//
// Change: IP_MULTICAST_LOOP : Enable / Disable loopback for outgoing
messages
//
// Compile : gcc -o server server.c
//
// This code has NOT been tested
//
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define MAXBUFSIZE 65536 // Max UDP Packet size is 64 Kbyte
int main()
{
int sock, status, socklen;
char buffer[MAXBUFSIZE];
struct sockaddr_in saddr;
struct ip_mreq imreq;
// set content of struct saddr and imreq to zero
memset(&saddr, 0, sizeof(struct sockaddr_in));
memset(&imreq, 0, sizeof(struct ip_mreq));
// open a UDP socket
sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
if ( sock < 0 )
perror("Error creating socket"), exit(0);
saddr.sin_family = PF_INET;
saddr.sin_port = htons(4096); // listen on port 4096
saddr.sin_addr.s_addr = htonl(INADDR_ANY); // bind socket to any
interface
status = bind(sock, (struct sockaddr *)&saddr, sizeof(struct
sockaddr_in));
if ( status < 0 )
perror("Error binding socket to interface"), exit(0);
imreq.imr_multiaddr.s_addr = inet_addr("226.0.0.1");
imreq.imr_interface.s_addr = INADDR_ANY; // use DEFAULT interface
// JOIN multicast group on default interface
status = setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP,
(const void *)&imreq, sizeof(struct ip_mreq));
socklen = sizeof(struct sockaddr_in);
// receive packet from socket
status = recvfrom(sock, buffer, MAXBUFSIZE, 0,
(struct sockaddr *)&saddr, &socklen);
// shutdown socket
shutdown(sock, 2);
// close socket
close(sock);
return 0;
}
----------- cut here ------------------
This is a sample multicast client without error handling
----------- cut here ------------------
// Multicast Client
// written for LINUX
// Version 0.0.2
//
// Change: IP_MULTICAST_LOOP : Enable / Disable loopback for outgoing
messages
//
// Compile : gcc -o client client.c
//
// This code has NOT been tested
//
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define MAXBUFSIZE 65536 // Max UDP Packet size is 64 Kbyte
int main()
{
int sock, status, socklen;
char buffer[MAXBUFSIZE];
struct sockaddr_in saddr;
struct in_addr iaddr;
unsigned char ttl = 3;
unsigned char one = 1;
// set content of struct saddr and imreq to zero
memset(&saddr, 0, sizeof(struct sockaddr_in));
memset(&iaddr, 0, sizeof(struct in_addr));
// open a UDP socket
sock = socket(PF_INET, SOCK_DGRAM, 0);
if ( sock < 0 )
perror("Error creating socket"), exit(0);
saddr.sin_family = PF_INET;
saddr.sin_port = htons(0); // Use the first free port
saddr.sin_addr.s_addr = htonl(INADDR_ANY); // bind socket to any
interface
status = bind(sock, (struct sockaddr *)&saddr, sizeof(struct
sockaddr_in));
if ( status < 0 )
perror("Error binding socket to interface"), exit(0);
iaddr.s_addr = INADDR_ANY; // use DEFAULT interface
// Set the outgoing interface to DEFAULT
setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF, &iaddr,
sizeof(struct in_addr));
// Set multicast packet TTL to 3; default TTL is 1
setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, &ttl,
sizeof(unsigned char));
// send multicast traffic to myself too
status = setsockopt(sock, IPPROTO_IP, IP_MULTICAST_LOOP,
&one, sizeof(unsigned char));
// set destination multicast address
saddr.sin_family = PF_INET;
saddr.sin_addr.s_addr = inet_addr("226.0.0.1");
saddr.sin_port = htons(4096);
// put some data in buffer
strcpy(buffer, "Hello world\n");
socklen = sizeof(struct sockaddr_in);
// receive packet from socket
status = sendto(sock, buffer, strlen(buffer), 0,
(struct sockaddr *)&saddr, socklen);
// shutdown socket
shutdown(sock, 2);
// close socket
close(sock);
return 0;
}
Good luck.
Dalton Hamilton
On Jun 28, 2005, at 5:50 PM, Chase wrote:
Scratch that last question. I've read a lot since yesterday on ICMP
and that question really didn't make any sense, now that I understand a
little more about it.
But, this little code snippet I found in an online tutorial isn't
catching any ICMP packets:
int main() {
char buffer[8192];
int fd = socket (PF_INET, SOCK_RAW, IPPROTO_ICMP);
printf("\nHere we go...\n");
while (read (fd, buffer, 8192) > 0) {
printf("Caught ICMP Packet\n");
}
return 0;
}
It compiles and runs fine, but never catches anything. It just sits on
the read() line, waiting indefinitely.
I tried unplugging/replugging routers to force them to send ICMP router
advertisements, but still nothing shows up.
Any ideas?
Thanks.
- Chase
PS: Anyone know of a higher volume list where I could ask these
questions? I'm practically the only poster for almost two straight
days.
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Macnetworkprog mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
email@hidden
This email sent to email@hidden