linux下udp广播不成功,求助?

cuishaoyuan 2012-05-22 02:38:30
在同一个系统下,启动udpserv,运行:udpcli 255.255.255.255,接收端口收不到消息,如果换成udp 255.* 或者udp localhost 都可以收到,唯独255.255.255.255不行,代码如下,帮忙看看是什么问题,是不是setsockopt有错
udpcli.cpp(发送端):

#include <sys/socket.h> //connect,send,recv,setsockoptµÈ
#include <sys/types.h>

#include <netinet/in.h> // sockaddr_in, "man 7 ip" ,htons

#include <poll.h> //poll,pollfd
#include <arpa/inet.h> //inet_addr,inet_aton
#include <unistd.h> //read,write
#include <netdb.h> //gethostbyname
#include <error.h> //perror
#include <stdio.h>
#include <errno.h> //errno
#include <stdlib.h>
#include <string.h> // memset
#include <apueeroor.h>

#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 <IPaddress>");



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(接收端)

#include <sys/socket.h> //connect,send,recv,setsockopt绛?
#include <sys/types.h>
#include <netinet/in.h> // sockaddr_in, "man 7 ip" ,htons
#include <poll.h> //poll,pollfd
#include <arpa/inet.h> //inet_addr,inet_aton
#include <unistd.h> //read,write
#include <netdb.h> //gethostbyname
#include <error.h> //perror
#include <stdio.h>
#include <errno.h> //errno
#include <stdlib.h>
#include <string.h> // 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;

}

...全文
188 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Joseph-Growth 2012-05-24
  • 打赏
  • 举报
回复
原因了,没看懂。
cuishaoyuan 2012-05-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
原因了,没看懂。
[/Quote]
理论上,上述setsockopt的两种方式都是可以的,这个可能跟运行环境有关系。。抱歉,具体我也不清楚,只是看到过别人使用
Wenxy1 2012-05-24
  • 打赏
  • 举报
回复
楼主注意广播地址的主机部分为全1。
cuishaoyuan 2012-05-23
  • 打赏
  • 举报
回复
哎,为什么我发帖都是0回复呢,100%结贴率都吸引不了你们,每次还是自己解决问题。。。解决方法如下
将发送端中

bool optval=true;
setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,(char*)&optval,sizeof(bool));//设置为广播模式

改为

int yes=1;
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &yes, sizeof(yes));

经测试通过

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧