调用setsockopt()函数时的WSAEINVAL错误

51 篇文章 0 订阅
49 篇文章 0 订阅

 这个问题是在实现多播实验的时候出现的一个错误,找出错误原因的方法比较笨,之后如果看到有好的方法再做更新

检查错误代码如下

	//加入多播组
	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层?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值