Calling setsockopt with MCAST_JOIN_GROUP results in error 10014: The system detected an invalid pointer address in attempting to use a pointer argument in a call.

Using similar code on Linux works fine, and using IPV6_JOIN_GROUP also works fine.

Here's my test code:

Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <ws2tcpip.h>
 
void sockerr(const char *message)
{
    char errbuf[300];
    FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, WSAGetLastError(),
                  0, errbuf, sizeof(errbuf), NULL);
    fprintf(stderr, "%s: (%d) %s", message, WSAGetLastError(), errbuf);
}
 
int main(int argc, char *argv[])
{
  int addr_len;
  struct sockaddr_in6 sin,sin_recv, *sreq;
  struct ipv6_mreq multi;
  struct group_req req;
  char mes[1500],name[100];
  int c,option,len;
  struct addrinfo *m_ai, *i_ai;
  struct WSAData data;
  SOCKET sock;
 
 
  if (WSAStartup(2,&data)) {
    sockerr("Error in WSAStartup");
    exit(1);
  }
 
  memset(&multi, 0, sizeof(multi));
  inet_pton(AF_INET6, "ff02::601:203", &multi.ipv6mr_multiaddr);
  multi.ipv6mr_interface = 11;
 
  memset(&req, 0, sizeof(req));
  sreq=(struct sockaddr_in6 *)&req.gr_group;
  sreq->sin6_family=AF_INET6;
  inet_pton(AF_INET6, "ff02::601:203", &sreq->sin6_addr);
  req.gr_interface = 11;
 
  memset(&sin,0,sizeof(sin));
  sin.sin6_family = AF_INET6;
  inet_pton(AF_INET6, "::", &sin.sin6_addr);
  sin.sin6_port = htons(1044);
  if ((sock=socket(AF_INET6,SOCK_DGRAM,0))==-1) {
    sockerr("Error creating socket");
    exit(1);
  }
  if (bind(sock,(struct sockaddr *)&sin,sizeof(sin))==-1) {
    sockerr("Error binding socket");
    closesocket(sock);
    exit(1);
  }
  //if (setsockopt(sock,IPPROTO_IPV6,IPV6_JOIN_GROUP,(char *)&multi,sizeof(multi))== -1) {
  if (setsockopt(sock,IPPROTO_IPV6,MCAST_JOIN_GROUP,(char *)&req,sizeof(req))== -1) {
    sockerr("Error joining multicast group");
    closesocket(sock);
    exit(1);
  }
 
  while (1) {
    memset(mes,0,sizeof(mes));
    memset(&sin_recv,0,sizeof(sin_recv));
    addr_len=sizeof(sin_recv);
    printf("%d: Waiting for packet...\n",getpid());
    if ((len=recvfrom(sock,mes,sizeof(mes),0,(struct sockaddr *)&sin_recv,&addr_len))==-1) {
      sockerr("error recving socket");
      closesocket(sock);
      exit(1);
    }
    if (inet_ntop(AF_INET6,&sin_recv.sin6_addr,name,sizeof(name))==NULL) {
      sockerr("inet_ntop failed");
      continue;
    }
    printf("%d: Got packet\n",getpid());
    printf("%d: Origin: %s port %d\n",getpid(),name,sin_recv.sin6_port);
    printf("%d: Len: %d, Message: %s\n",getpid(),len,mes);
  }
}
Any ideas?

(Also posted to http://cboard.cprogramming.com/windo...ndows-7-a.html)