I have a small program that I am broadcasting out on port 36 and
attempting to receive information back.
Using "tcpdump port 36" I can see 2 devices responding to me
but I get no data.
The response my program gets is:
Size IP Address Subnet MAC Address ID
20 0.0.0.0 0.0.0.0 00-00-00-00-00-00
Does someone know what I might not be doing correct?
Running the same program under windows works, running it under wine on
linux works
it just doesnt work on linux.
I have iptables disabled at this time.
Thanks for nay suggestions.
Jerry
----------------------------
tcpdump -x port 36
-------------------------
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
08:42:49.286701 IP devcentos64.msgnet.com.36 > 255.255.255.255.36: UDP,
length 20
0x0000: 4500 0030 0000 4000 4011 790b c0a8 010a E..0..@.@.y.....
0x0010: ffff ffff 0024 0024 001c ca61 4321 3039 .....$.$...aC!09
0x0020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
08:42:49.286976 IP ecov132.msgnet.com.36 > devcentos64.msgnet.com.36:
UDP, length 20
0x0000: 4500 0030 03c2 0000 8011 b2f2 c0a8 01ae E..0............
0x0010: c0a8 010a 0024 0024 001c a0e2 4321 3039 .....$.$....C!09
0x0020: c0a8 01ae ffff 0000 0001 3cd0 67ff 0001 ..........<.g...
08:42:49.286990 IP ecov432_testing.msgnet.com.36 >
devcentos64.msgnet.com.36: UDP, length 20
0x0000: 4500 0030 091a 0000 8011 ad8f c0a8 01b9 E..0............
0x0010: c0a8 010a 0024 0024 001c b581 4321 3039 .....$.$....C!09
0x0020: c0a8 01b9 ffff ff00 0001 3cd0 5449 0001 ..........<.TI..
My program is:
int main(int argc, char *argv[])
{
int error;
int total = 0;
int socket_handle;
enum
{
NMP_PORT = 36,
NMP_MAGIC = 0x4321,
NMP_LIST = 12345,
NMP_SET_IP,
NMP_SET_MASK
};
typedef union
{
unsigned char b[4];
uint32_t v;
} IPADDR;
typedef struct
{
unsigned char b[6];
} MACADDR;
typedef struct
{
unsigned short magic;
unsigned short code;
IPADDR ip;
IPADDR mask;
MACADDR mac;
ushort Deviceid;
} HD_NMP;
HD_NMP nmp;
struct sockaddr_in broadcast_address;
bzero((char *) &broadcast_address, sizeof(broadcast_address));
broadcast_address.sin_family = AF_INET;
broadcast_address.sin_port = htons(NMP_PORT);
broadcast_address.sin_addr.s_addr = inet_addr("255.255.255.255");
socket_handle = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(socket_handle >= 0)
{
int byes = 1;
fd_set read_set;
struct timeval tm;
if(setsockopt(socket_handle, SOL_SOCKET, SO_BROADCAST, &byes, sizeof(byes)) >= 0)
{
if(bind(socket_handle, (struct sockaddr *) &broadcast_address, sizeof(broadcast_address)) < 0)
{
printf("bind error\n");
}
memset(&nmp, 0, sizeof(nmp));
nmp.magic = IWord(NMP_MAGIC);
nmp.code = IWord(NMP_LIST);
sendto(socket_handle, &nmp, sizeof(nmp), 0, (struct sockaddr *) &broadcast_address, sizeof(broadcast_address));
printf("%-4s %-15s %-15s %-17s %6s\n", "Size", "IP Address", "Subnet", "MAC Address", "ID");
while(1)
{
tm.tv_sec = 0;
tm.tv_usec = 500000;
FD_ZERO(&read_set);
FD_SET(socket_handle, &read_set);
error = select(socket_handle + 1, &read_set, NULL, NULL, &tm);
if(error <= 0)
{
break;
}
else
{
char ip_str[100];
char mac_str[100];
char mask_str[100];
error = recvfrom(socket_handle, &nmp, sizeof(nmp), 0, NULL, 0);
if(error < 0)
{
printf("errno=%d %s\n", errno, strerror(errno));
continue;
}
else if(nmp.code != IWord(NMP_LIST))
{
printf("unknown return\n");
continue;
}
else
{
sprintf(ip_str, "%d.%d.%d.%d ", nmp.ip.b[0], nmp.ip.b[1], nmp.ip.b[2], nmp.ip.b[3]);
sprintf(mask_str, "%d.%d.%d.%d ", nmp.mask.b[0], nmp.mask.b[1], nmp.mask.b[2], nmp.mask.b[3]);
sprintf(mac_str, "%02X-%02X-%02X-%02X-%02X-%02X", nmp.mac.b[0], nmp.mac.b[1], nmp.mac.b[2], nmp.mac.b[3], nmp.mac.b[4], nmp.mac.b[5]);
printf(" %2d %-15s %-15s %-15s\n", error, ip_str, mask_str, mac_str);
total++;
}
}
}
}
close(socket_handle);
}
return(0);
}
_______________________________________________
CentOS mailing list
CentOS@xxxxxxxxxx
http://lists.centos.org/mailman/listinfo/centos