LWIP中的setsockopt调用返回错误

煎蛋的猫 2016-05-19 07:37:16
#define MCAST_PORT 8888
#define MCAST_ADDR "224.0.0.100"
#define MCAST_INTERVAL 5

#define BUFF_SIZE 256
void MultiClientThread(const char* url, int port){
int socketfd; /*套接字文件描述符*/
struct sockaddr_in local_addr; /*本地地址*/
int err = -1;
socketfd = socket(AF_INET, SOCK_DGRAM, 0); /*建立套接字*/
if (socketfd == -1)
{
DBGPRINT_LWIP("MulticastClient socket()\r\n");
return ;
}
memset(&local_addr, 0, sizeof(local_addr));
local_addr.sin_family = AF_INET;
local_addr.sin_addr.s_addr = htonl(INADDR_ANY);
local_addr.sin_port = htons(MCAST_CLIENT_PORT);

/*绑定socket*/
err = bind(socketfd,(struct sockaddr*)&local_addr, sizeof(local_addr)) ;
if(err < 0)
{
DBGPRINT_LWIP("bind()");
return ;
}
int loop = 1;
err = getsockopt(socketfd, SOL_SOCKET, SO_SNDBUF, &loop, sizeof(loop));
if(err < 0)
{
DBGPRINT_LWIP("getsockopt():SO_REUSEADDR error\r\n");
return ;
}
err = setsockopt(socketfd,SOL_SOCKET, SO_REUSEADDR,&loop, sizeof(loop));
if(err < 0)
{
DBGPRINT_LWIP("setsockopt():SO_REUSEADDR error\r\n");
return ;
}

struct ip_mreq mreq; /*加入多播组*/
mreq.imr_multiaddr.s_addr = inet_addr(MCAST_ADDR); /*多播地址*/
mreq.imr_interface.s_addr = htonl(INADDR_ANY); /*网络接口为默认*/
/*将本机加入多播组*/
err = setsockopt(socketfd, IPPROTO_IP, IP_ADD_MEMBERSHIP,&mreq, sizeof(mreq));
if (err < 0)
{
DBGPRINT_LWIP("setsockopt():IP_ADD_MEMBERSHIP error\r\n");
return ;
}
else{
DBGPRINT_LWIP("setsockopt():IP_ADD_MEMBERSHIP OK!\r\n");
}
int times = 0;
int addr_len = 0;
char buff[BUFF_SIZE];
int n = 0;
/*循环接收多播组的消息,5次后退出*/
while(1)
{
addr_len = sizeof(local_addr);
memset(buff, 0, BUFF_SIZE); /*清空接收缓冲区*/
/*接收数据*/
n = lwip_recvfrom(socketfd, buff, BUFF_SIZE, 0,(struct sockaddr*)&local_addr,&addr_len);
if( n== -1)
{
DBGPRINT_LWIP("recvfrom()\r\n");
}
/*打印信息*/
DBGPRINT_LWIP("Recv %dst message from server:%s\n", times, buff);
sleep(MCAST_INTERVAL);
}
err = lwip_setsockopt(socketfd, IPPROTO_IP, IP_DROP_MEMBERSHIP,&mreq, sizeof(mreq));
close(socketfd);

}


为什么在Linux环境下测试接收加入组播正常
在移植lwip的ucos中,setsockopt 和 getsockopt 都会返回错误,还有错误码是用哪个打印?
...全文
902 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zky26 2016-06-21
  • 打赏
  • 举报
回复
你好 我现在也遇到这样的错误 ..\User\LwIP\lwip-1.4.1\src\core\init.c(176): error: #35: #error directive: "When using IGMP, LWIP_RAND() needs to be defined to a random-function returning an u32_t random value" 编译 找不到LWIP_RAND() 楼主是否解决了! 求指教。谢谢
煎蛋的猫 2016-05-19
  • 打赏
  • 举报
回复
增加了一条 memset(&(server_addr.sin_zero),0, sizeof(server_addr.sin_zero)); 还是没有解决,也不知道这个size_zero是有什么作用
煎蛋的猫 2016-05-19
  • 打赏
  • 举报
回复
也将netif->flags 中添加了 NETIF_FLAG_IGMP的参数
煎蛋的猫 2016-05-19
  • 打赏
  • 举报
回复
怀疑是LWIP移植的某些定义没有放开,只把LWIP_IGMP 置1,不知大家有没有遇到过会报错 lwip_init.c:error:#error"when using IGMP,LWIP_RAND() needs to be defined to a random-function returning an u32_t random value"
meng256011 2016-05-19
  • 打赏
  • 举报
回复
我也遇到这个问题了 有哪位会的给解答一下 必须顶起来 不能沉下去
煎蛋的猫 2016-05-19
  • 打赏
  • 举报
回复
没有思路
煎蛋的猫 2016-05-19
  • 打赏
  • 举报
回复
头一次发帖呢
煎蛋的猫 2016-05-19
  • 打赏
  • 举报
回复
这个点的人们都在干嘛,,是不是太菜没人理

18,356

社区成员

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

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