linux下udp广播不成功,求助?
在同一个系统下,启动udpserv,运行:udpcli 255.255.255.255,接收端口收不到消息,如果换成udp 255.* 或者udp localhost 都可以收到,唯独255.255.255.255不行,代码如下,帮忙看看是什么问题,是不是setsockopt有错
udpcli.cpp(发送端):C/C++ code#include //connect,send,recv,setsockoptµÈ
#include
#include // sockaddr_in, "man 7 ip" ,htons
#include //poll,pollfd
#include //inet_addr,inet_aton
#include //read,write
#include //gethostbyname
#include //perror
#include
#include //errno
#include
#include // memset
#include
#define MAXLINE 4096
#define EHCO_PORT 9877
#define BOOL unsigned char
int main(int argc, char **argv)
{
int sockfd;
struct sockaddr_in servaddr;
if(argc != 2)
err_quit("usage: udpcli ");
bzero(&servaddr, sizeof(servaddr));
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
bool optval=true;
setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,(char*)&optval,sizeof(bool));//设置为广播模式
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(EHCO_PORT);
inet_pton(AF_INET, argv[1], &servaddr.sin_addr);
int n;
char sendline[MAXLINE]="", recvline[MAXLINE + 1];
while (fgets(sendline, MAXLINE, stdin) != NULL) {
sendto(sockfd, sendline, strlen(sendline), 0, (struct sockaddr *) &servaddr, sizeof(servaddr));
n = recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL);
recvline[n] = 0; /* null terminate */
fputs(recvline, stdout);
//exit(0);
}
}
udpserv.cpp(接收端)C/C++ code#include //connect,send,recv,setsockopt绛?
#include
#include // sockaddr_in, "man 7 ip" ,htons
#include //poll,pollfd
#include //inet_addr,inet_aton
#include //read,write
#include //gethostbyname
#include //perror
#include
#include //errno
#include
#include // memset
#define MAXLINE 4096
#define EHCO_PORT 9877
int
main(int argc, char **argv)
{
int sockfd;
struct sockaddr_in servaddr, cliaddr;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(EHCO_PORT);
bool optval=true;
setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,(char*)&optval,sizeof(bool));//设置为广播模式
bind(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
int n;
socklen_t len;
char mesg[MAXLINE];
for ( ; ; ) {
len = sizeof(cliaddr);
n = recvfrom(sockfd, mesg, MAXLINE, 0, (struct sockaddr *) &cliaddr, &len);
mesg[n]=0; /* null terminate */
if(strcmp(mesg, "close\n") ==0){close(sockfd);break;}
fputs(mesg, stdout);
sendto(sockfd, mesg, n, 0, (struct sockaddr *) &cliaddr, len);
}
close(sockfd);
return 0;
}
------解决方案--------------------
原因了,没看懂。
------解决方案--------------------
楼主注意广播地址的主机部分为全1。