gpt4 book ai didi

c++ - setsockopt 返回错误 10014

转载 作者:行者123 更新时间:2023-11-28 02:55:11 32 4
gpt4 key购买 nike

我正在尝试编写一个简单的 UDP 服务器,在多播组上公布其服务端口,但我无法让多播正常工作。我尝试查看 Microsoft 文档并复制/粘贴他们的一些代码,但它不起作用。这是有问题的代码:

    this->port = srvc_port; //11129 in my example
this->mcast_port = mcast_port; //11130 in my example
this->mcast_ip = mcast_ip; //230.0.0.30 in my example

int iResult = WSAStartup(MAKEWORD(2,2), &service_wsaData);
if (iResult != NO_ERROR)
{
cout << "WSAstartup failed" << endl;
return -1;
}

service_sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (service_sock == INVALID_SOCKET) {
closesocket(service_sock);
WSACleanup();
cout << "Error at socket" << endl;
return -1;
}

mcast_sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(mcast_sock == INVALID_SOCKET) {
closesocket(mcast_sock);
WSACleanup();
cout << "Error at socket" << endl;
return -1;
}

multicast.sin_family = AF_INET; // multicast is a sockaddr_in struct
multicast.sin_addr.s_addr = INADDR_ANY;
multicast.sin_port = htons(mcast_port);

service.sin_family = AF_INET; //same for service
service.sin_addr.s_addr = INADDR_ANY;
service.sin_port = htons(port);

if(::bind( service_sock, (sockaddr *)&service, sizeof(service) ) == SOCKET_ERROR) {
closesocket(mcast_sock);
closesocket(service_sock);
WSACleanup();
cout << "Error binding service socket" << endl;
return -1;
};

if(::bind( mcast_sock, (sockaddr *)&multicast, sizeof(multicast) ) == SOCKET_ERROR) {
closesocket(mcast_sock);
closesocket(service_sock);
WSACleanup();
cout << "Error binding multicast socket" << endl;
return -1;
};

mreq.imr_multiaddr.s_addr = inet_addr(mcast_ip.c_str()); //mreq is declared like so "struct ip_mreq mreq;" in the class
mreq.imr_interface.s_addr = htonl(INADDR_ANY);

if(setsockopt(mcast_sock,IPPROTO_IP,IP_ADD_SOURCE_MEMBERSHIP,(char *) &mreq, sizeof(mreq)) == SOCKET_ERROR)
{
//I get error 10014 here
cout << "Error: " << WSAGetLastError() << endl;
return -1;
}

如有任何帮助,我们将不胜感激。

最佳答案

10014 是 WSAEFAULT,这意味着 “optval 参数指向的缓冲区不在进程地址空间的有效部分或者 optlen 参数太小。

阅读文档:

IPPROTO_IP Socket Options

IP_ADD_SOURCE_MEMBERSHIP 需要一个指向 ip_mreq_source 的指针结构:

typedef struct ip_mreq_source {
struct in_addr imr_multiaddr;
struct in_addr imr_sourceaddr;
struct in_addr imr_interface;
} IP_MREQ_SOURCE, *PIP_MREQ_SOURCE;

你传递给它一个指向 ip_mreq 的指针结构改为:

typedef struct ip_mreq {
struct in_addr imr_multiaddr;
struct in_addr imr_interface;
} IP_MREQ, *PIP_MREQ;

ip_mreq 小于 ip_mreq_source,因此 sizeof(mreq) 对于 IP_ADD_SOURCE_MEMBERSHIP 来说太小了。您需要将您的 mreq 变量更改为 ip_mreq_source,并确保填写其 imr_sourceaddr 成员。

ip_mreq 用于 IP_ADD_MEMBERSHIPIP_DROP_MEMBERSHIP

ip_mreq_source 用于 IP_ADD_SOURCE_MEMBERSHIPIP_DROP_SOURCE_MEMBERSHIPIP_BLOCK_SOURCEIP_UNBLOCK_SOURCE .

关于c++ - setsockopt 返回错误 10014,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22160950/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com