日期:2014-05-16  浏览次数:20695 次

嵌入式linux udp协议的socket发送数据问题
嵌入式linux,一个接收组播的客户端,加入组播
setsockopt(s,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char *)&mreq,sizeof(mreq))

退出组播
setsockopt(s,IPPROTO_IP,IP_DROP_MEMBERSHIP,(char *)&mreq,sizeof(mreq))

如何保证在调用这两个函数之后关闭socket(close(s))之前,socket的数据能够正常发送呢?


igmp_open(igmpaddr[i]);//初始化
igmp_join();//加入组播
igmp_leave();//退出组播
igmp_free();//关闭socket

如果按照这个顺序调用,中间不做什么操作,抓包看不到组播相关的数据(加入组播消息和退出组播消息)。
如果调用函数之间usleep 一小段时间,相关消息就能抓到。
我怀疑在执行setsockopt函数的时候数据并没有发送,而是在socket的缓冲区,结果没有来得及发送就关闭了socket,导致数据被丢弃了。
不过只是在leave和free函数之间调用usleep,同样是抓不到相关消息。这个比较奇怪。

嵌入式的开发板上测试,在ubuntu的pc上也做过测试,会有同样的问题。只是pc上usleep时间可以短一点。

请问:这个问题朝这方面考虑正确吗?如果正确,socket的发送数据该如何保证正常发送?
谢谢

------解决方案--------------------
使用shutdown函数吧。
------解决方案--------------------
看一下,man 7 socket手册里面的setsockopt的SO_LINGER选项;这个选项可以解决上面的问题;