多播问题
准备用live555发送h264,在调试如下代码时一直出错。
Boolean socketJoinGroup(UsageEnvironment& env, int socket,netAddressBits groupAddress)
{
...
if (setsockopt(socket, IPPROTO_IP, IP_ADD_MEMBERSHIP,
(const char*)&imr, sizeof (struct ip_mreq)) < 0) {...}
...
}
分析如下:
by default live library includes winsock.h through windows.h instead of winsock2.h, but requires Winsock 2 in initializeWinsockIfNecessary(...) function.
IP_ADD_MEMBERSHIP value for Winsock1 is 5, and for Winsock 2 is 12.
Therefore socketJoinGroup(...) function is trying to call setsockopt(IP_ADD_MEMBERSHIP) from Winsock 2 with optname from Winsock 1.
There is the confusion between Winsock versions.
大概的意思就是:winsock使用上混乱,用Winsock2的setsockopt调用Winsock1的optname。
解决如下:
修改为: if (setsockopt(socket, IPPROTO_IP, 12,
(const char*)&imr, sizeof (struct ip_mreq)) < 0) {
因为不同的socket版本,定义IP_ADD_MEMBERSHIP 的值不同:
in socket ver1.0中:
#define IP_ADD_MEMBERSHIP 5
in socket ver2.0中:
#define IP_ADD_MEMBERSHIP 12
在哪里引入winsock.h
在NetCommon.h中会引入#include <windows.h>,在windows.h中会引入winsock.h,如下所示:
#ifndef _MAC
#include <winperf.h>
#include <winsock.h>
#endif