LWIP中的setsockopt调用返回错误

煎蛋的猫 煎蛋的猫 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
#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 都会返回错误,还有错误码是用哪个打印?
...全文

相关推荐

评论 8
收藏 已收藏
分享
返回顶部
煎蛋的猫
网络编程 18,356 成员 64,161 内容