|
|
我在fedora下使用socket多播编程,局域网内的windows机器能收到,本机收不到,局域网内的其他机器进行多播,我的fedora也收不到!!!急!!!
fc5、fedora7都不行
多播程序:
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
#include <stdlib.h>
int port = 8889;
int main(void)
{
int socket_descriptor;
struct sockaddr_in address;
socket_descriptor = socket(AF_INET, SOCK_DGRAM, 0);
if (socket_descriptor == -1) {
perror("Opening socket");
exit(EXIT_FAILURE);
}
/* Initialize the address structure */
memset(&address, 0, sizeof(address));
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr("224.0.0.1");
address.sin_port = htons(port);
/* Start broadcasting */
while(1) {
if(sendto(socket_descriptor, "test from broadcast",
sizeof("test from broadcast"), 0,
(struct sockaddr *)&address, sizeof(address)) < 0) {
perror("sendto");
exit(EXIT_FAILURE);
}
sleep(2);
}
exit(EXIT_SUCCESS);
}
监听程序:
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdlib.h>
#include <unistd.h>
#include <memory.h>
int port = 8889;
int main(void)
{
struct ip_mreq command;
int loop = 1; /* The broadcast loops back to localhost */
int iter = 0;
socklen_t sin_len;
char message[256];
int socket_descriptor;
struct sockaddr_in sin;
// struct hostent *server_host_name;
bzero(&sin, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(INADDR_ANY);
sin.sin_port = htons(port);
if((socket_descriptor = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
/* Allow multiple processes to use this same port:*/
loop = 0;
if(setsockopt(socket_descriptor, SOL_SOCKET, SO_REUSEADDR,
&loop, sizeof(loop)) < 0) {
perror("setsockopt:SO_REUSEADDR");
exit(EXIT_FAILURE);
}
if(bind(socket_descriptor, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
perror("bind");
exit(EXIT_FAILURE);
}
/* Allow broadcast to this machine */
loop = 1;
if(setsockopt(socket_descriptor, IPPROTO_IP, IP_MULTICAST_LOOP,
&loop, sizeof(loop)) < 0) {
perror("setsockopt:IP_MULTICAST_LOOP");
exit(EXIT_FAILURE);
}
/* Join the broadcast group:*/
command.imr_multiaddr.s_addr = inet_addr("224.0.0.1");
command.imr_interface.s_addr = htonl(INADDR_ANY);
if(command.imr_multiaddr.s_addr == -1) {
perror("224.0.0.1 not a legal multicast address");
exit(EXIT_FAILURE);
}
if (setsockopt(socket_descriptor, IPPROTO_IP, IP_ADD_MEMBERSHIP,
&command, sizeof(command)) < 0) {
perror("setsockopt:IP_ADD_MEMBERSHIP");
}
while(iter++ < 10) {
sin_len = sizeof(sin);
if(recvfrom(socket_descriptor, message, 256, 0,
(struct sockaddr *)&sin, &sin_len) == -1) {
perror("recvfrom");
}
printf("Response #%-2d from server: %s\n", iter, message);
sleep(2);
}
/* leave the broadcast group */
if(setsockopt(socket_descriptor, IPPROTO_IP, IP_DROP_MEMBERSHIP,
&command, sizeof(command)) < 0) {
perror("setsockopt:IP_DROP_MEMBERSHIP");
}
close(socket_descriptor);
exit(EXIT_SUCCESS);
} |
|