这个问题是在实现多播实验的时候出现的一个错误,找出错误原因的方法比较笨,之后如果看到有好的方法再做更新
检查错误代码如下:
//加入多播组
ip_mreq mcast;
mcast.imr_interface.S_un.S_addr=INADDR_ANY;
mcast.imr_multiaddr.S_un.S_addr=inet_addr("234.5.6.7");
int nRet=setsockopt(recvSock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mcast, sizeof(mcast));
if(nRet==SOCKET_ERROR)
{
int nErr=WSAGetLastError();
switch(nErr)
{
case WSANOTINITIALISED:
printf("WSANOTINITIALISED\n");
return;
case WSAENETDOWN:
printf("WSAENETDOWN\n");
return;
case WSAEFAULT:
printf("WSAEFAUL\nT");
return;
case WSAEINPROGRESS:
printf("WSAEINPROGRESS\n");
return;
case WSAEINVAL:
printf("WSAEINVAL\n");
return;
case WSAENETRESET:
printf("WSAENETRESET\n");
return;
case WSAENOPROTOOPT:
printf("WSAENOPROTOOPT\n");
return;
case WSAENOTCONN:
printf("WSAENOTCONN\n");
return;
case WSAENOTSOCK:
printf("WSAENOTSOCK\n");
return;
}
}
程序的实现顺序如下:
1. 创建套接字;
2.设置套接字选项,使之加入多播组;
3.绑定套接字;
其中,在设置套接字选项时,出现错误提示:WSAEINVAL
setsockopt()函数的说明如下:
int setsockopt(SOCKET s, int level, int optname, const char FAR *optval, int optlen);
MSDN关于该错误的解释如下:
level is not valid, or the information in optval is not valid.
即该层是不合法的,或者optval参数设置不合法
但是这两个参数是都没有问题的;
解决办法:
调换程序的实现顺序:
1. 创建套接字;
2. 绑定套接字;
3. 设置套接字选项,使之加入多播组;
原因:
尚未知,不绑定不能设置IP层?