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。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐