- 论坛徽章:
- 0
|
这是一个收发广播的守护进程,主机ip为192.168.0.10,对方ip为192.168.0.20/192.168.1.20。对方对指定端口广播,守护进程收到后广播相应数据。
当0.10通过pppoe拨号联网后,可以接受到广播,但送出的广播不能被对方收到。因鄙人技术浅薄,故对此现象束手无策。该问题如何解决?请诸位不吝赐教。万分感谢。代码如下。
void udp_serv()
{
int sockfd;
struct sockaddr_in servaddr, cliaddr;
int yes=1;
if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
fprintf(fp, "socket error.\n");
exit(-1);
}
bzero(&servaddr, sizeof(struct sockaddr_in));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(BIND_PORT);
setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &yes, sizeof(yes));
if(bind(sockfd, (struct sockaddr *)&servaddr,sizeof(servaddr)) < 0)
{
fprintf(fp, "bind error.\n");
exit(-1);
}
int lenrecv,lensend,buflen;
socklen_t len;
char msgrecv[MAXLINE],accept[MAXLINE];
char *mac = NULL;
char *devname = NULL;
char *reject = "Who Is It?";
char *send = NULL;
time_t now;
for(;;)
{
if((lenrecv = recvfrom(sockfd, msgrecv, MAXLINE, 0, (struct sockaddr *)&cliaddr, &len)) < 0)
{
fprintf(fp, "recvfrom error.\n");
}
else
{
time(&now);
fprintf(fp,"%srecv from [%s]: <%s>\n",ctime(&now),sock_ntop((struct sockaddr *)&cliaddr,len), msgrecv);
}
if(strstr(msgrecv,"Where is xxxx?") != 0)
send = accept;
else
send = reject;
cliaddr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
mac = get_mac();
devname = get_device_name();
bzero(msgrecv,MAXLINE);
bzero(accept,MAXLINE);
buflen = sprintf(accept,"xxxx is here!\n%s\n%s",mac,devname);
free(devname);
free(mac);
if((lensend = sendto(sockfd, send, strlen(send),0,\
(struct sockaddr *)&cliaddr, len)) != buflen)
fprintf(fp,"sendto error.\n");
fflush(fp);
}
}
|
另附pppoe前后route的变化。
前:
[root@xxxx cgi-bin]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.0.0 * 255.255.255.0 U 0 0 0 eth0
169.254.0.0 * 255.255.0.0 U 0 0 0 eth0
default 192.168.0.1 0.0.0.0 UG 0 0 0 eth0
后:
[root@qualvideo cgi-bin]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
61.149.144.1 * 255.255.255.255 UH 0 0 0 ppp0
192.168.0.0 * 255.255.255.0 U 0 0 0 eth0
169.254.0.0 * 255.255.0.0 U 0 0 0 eth0
default * 0.0.0.0 U 0 0 0 ppp0 |
|