I wrote something like this:
SOCKET g_Socket = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP); // IPPROTO_HOPOPTS
if (g_Socket == INVALID_SOCKET) {
MessageBoxW(0, L"socket error !", L_PROGRAM_NAME, 0);
return 1;
}
int trueFlag = 0x1;
if (setsockopt(g_Socket, SOL_SOCKET, SO_BROADCAST, (const char FAR*) & trueFlag, sizeof(trueFlag)) != 0) {
MessageBoxW(0, L"set SO_BROADCAST error !", L_PROGRAM_NAME, 0);
return 1;
}
setsockopt(g_Socket, IPPROTO_IPV6, IPV6_V6ONLY, (const char FAR*) & trueFlag, sizeof(trueFlag));
long bufLen;
bufLen = SOCKET_BUFFER_SIZE;
iResult = setsockopt(g_Socket, SOL_SOCKET, SO_SNDBUF, (char*)&bufLen, sizeof(bufLen));
bufLen = SOCKET_BUFFER_SIZE;
iResult = setsockopt(g_Socket, SOL_SOCKET, SO_RCVBUF, (char*)&bufLen, sizeof(bufLen));
BOOL bNewBehavior = FALSE;
DWORD dwBytesReturned = 0;
WSAIoctl(g_Socket, SIO_UDP_CONNRESET, &bNewBehavior, sizeof(bNewBehavior), NULL, 0, &dwBytesReturned, NULL, NULL);
sockaddr_in6 DestAddr;
memset(&DestAddr, 0, sizeof(DestAddr));
DestAddr.sin6_family = AF_INET6;
DestAddr.sin6_port = htons(CLIENT_PORT); // in6addr_any
DestAddr.sin6_addr = in6addr_any;
iResult = bind(g_Socket, (SOCKADDR*)&DestAddr, sizeof(DestAddr));
if (iResult != 0) {
MessageBoxW(0, L"Cant' bind socket !", L_PROGRAM_NAME, 0);
return 1;
}
memset(&DestAddr, 0, sizeof(DestAddr) );
DestAddr.sin6_family = AF_INET6;
DestAddr.sin6_port = htons( SERVER_PORT );
DestAddr.sin6_scope_id = 24;
if (InetPtonW(AF_INET6, L"fe80::a549:ed77:39be:98ed", DestAddr.sin6_addr.s6_addr)!=1) {
sprintf(szBuffer, "%u", WSAGetLastError());
MessageBoxA(0, szBuffer, "InetPtonW error", 0);
}
int rv = sendto(g_Socket, (char*)message, len, 0, (SOCKADDR*)&DestAddr, sizeof(DestAddr) );
if (rv == SOCKET_ERROR) {
sprintf(szBuffer, "%u", WSAGetLastError());
MessageBoxA(0, szBuffer, "sendto error", 0);
}
But after using the sendto function, I get error 10038 (WSAENOTSOCK). Why?