linux udp 收不到广播数据,linux下udp广播不成功,

在Linux环境下,UDP广播不成功,代码已提供。当使用255.255.255.255作为目标地址时,接收端无法收到消息,而其他地址如255.* 或 localhost则正常。问题可能出在setsockopt设置上,但广播模式已正确启用。解决方案提到广播地址的主机部分应全为1。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值