linux下发udp广播包的问题
以下是我的代码,
main()
{
struct sockaddr_in addrto;
int s,nlen,ret;
int opt=1;
char *smsg="this is a test";
s = socket(AF_INET, SOCK_DGRAM, 0);
printf("create socket %d\n",s);
bsocket=1;
addrto.sin_family=AF_INET;
addrto.sin_addr.s_addr=INADDR_BROADCAST;
addrto.sin_port=htons(38769);
ret = setsockopt(s,SOL_SOCKET,SO_BROADCAST,(char *)&opt,sizeof(opt));
printf("sock = %d set sockopt ret = %d\n",s,ret);
nlen=sizeof(struct sockaddr_in);
ret=sendto(s,smsg,256,0,(struct sockaddr*)&addrto,nlen);
printf("send boradcast ret=%d le=%d\n",ret,nlen);
}
此代码在windows下可以,而且在cygwin的环境下gcc编译运行也可以正常发送广播包,就是在linux下运行时sendto老是返回-1,发送失败,不知是和原因?
问题点数:50、回复次数:8Top
1 楼ssli(30岁的程序员)回复于 2005-06-02 21:17:45 得分 0
ret=sendto(s,smsg,256,0,(struct sockaddr*)&addrto,nlen);
把它改为
ret=sendto(s,smsg,strlen(smsg),0,(struct sockaddr*)&addrto,nlen);
试试Top
2 楼gettext(冰雪之崖)回复于 2005-06-03 08:22:25 得分 0
你把errno打出来不久知道原因了吗?Top
3 楼sharkhuang(走吧走吧!人总会慢慢长大~)回复于 2005-06-03 09:03:21 得分 0
对打出errno是做好的办法。协议会告诉你是什么错误Top
4 楼daphant(狒狒)回复于 2005-06-03 09:13:00 得分 0
多谢2为回答,我改成strlen(smsg),还是不行,另请问下,如何获取错误代码,我只知道windows下是WSAGetLastError,没找到linux下是什么函数?
还有我做了个实验,比如我linux系统ip是192.168.1.1,我可以发送192.168.1.255这样1网段内广播,但是我试图发送192.168.2.255 2网段内广播就出现问题了,那我想发送255.255.255.255这样的全网段广播,linux下又应该怎么设置呢,有代码的朋友也帮忙贴一下啊 谢谢啦Top
5 楼daphant(狒狒)回复于 2005-06-06 09:16:15 得分 0
顶起来
还请高手赐教,有代码的朋友能不能贴点参考参考
就是linux下发送个广播包就行Top
6 楼lvxn_sina(XN)回复于 2005-06-06 14:04:14 得分 0
errno不就是错误码吗?
全局变量Top
7 楼sourceid()回复于 2005-06-06 19:27:23 得分 0
W.Richard Stevens写的UNP书上有例子.Top
8 楼gaoxianfeng(高)回复于 2005-06-07 10:52:53 得分 50
广播一般是子网内广播
你要先获得自己的协议栈设定的掩码
然后根据这个再设定你的广播域
但udp
如果有发255.255.255.255 一般是没有掩码设定 如在dhcp之前
如果发向其它网段udp广播 你至少需要有默认路由Top




