Sockets IPV6连接错误10049(A增益!)

Sockets IPV6连接错误10049(A增益!),sockets,network-programming,ipv6,Sockets,Network Programming,Ipv6,因此,作为预防措施,我将windows 8防火墙配置为允许IPV6出站和入站连接,但每当我尝试使用环回地址连接到远程主机或我自己的计算机(连接到同时运行的IPV6服务器应用程序)时,无论我选择哪个端口,连接功能都会失败,并出现错误10049。这是网络配置问题吗?IP4工作正常 #include "stdafx.h" #include <iostream> #include <iostream> #include <string> #include <st

因此,作为预防措施,我将windows 8防火墙配置为允许IPV6出站和入站连接,但每当我尝试使用环回地址连接到远程主机或我自己的计算机(连接到同时运行的IPV6服务器应用程序)时,无论我选择哪个端口,连接功能都会失败,并出现错误10049。这是网络配置问题吗?IP4工作正常

#include "stdafx.h"
#include <iostream>
#include <iostream>
#include <string>
#include <stdlib.h>


#ifndef UNICODE
#define UNICODE
#endif

#define WIN32_LEAN_AND_MEAN






#include <winsock2.h>
#include <WS2tcpip.h>
#include <ws2ipdef.h>
#include <iphlpapi.h>
#include <IPTypes.h>


#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib,"iphlpapi.lib")



using namespace std;


static int MAXPENDING = 5;

void set_interface(SOCKET s, DWORD Index);






int main(int argc,char* argv[])
{

    WSADATA wsaData;
    int Result;
    int  optv = 1;
    char *optval = (char*)&optv;
    int  optlen = sizeof(optval);
    DWORD Index = 22;       
    bool connected = false;
    string exit = "quit";
    string name;
    sockaddr_in6 c_addr;
    c_addr.sin6_family = AF_INET6;

    char buffer[1024];







    Result = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (Result != NO_ERROR) {
        printf("WSAStartup function failed with error: %d\n", GetLastError());
        return 0;
    }





    SETUP:

        SOCKET connector;
        connector = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
        if (connector == INVALID_SOCKET) {
            wprintf(L"socket function failed with error: %ld\n", WSAGetLastError());
            closesocket(connector);
            return 1;
        }









        cout << "Enter host name(URL): ";
        cin >> name;
        cout << endl;   



        char *hostname = const_cast<char*>(name.c_str());   

        if(inet_pton(AF_INET6,hostname,&c_addr.sin6_addr)<0){
            printf("InetPton() function failed with error: %d/n",GetLastError());
            closesocket(connector);
            return 1;
        }





        string p;
        char *hostport;
        int p0rt;
        cout << "Enter the port number you wish to connect on: " ;
        cin >> p;
        cout << endl;   
        hostport = const_cast<char*>(p.c_str());
        p0rt = atoi(hostport);

        if(!( 0 < p0rt  &&  p0rt < 65,536)){
            cout << "Error: port number must be greater than 0 and less than 65,536. " << endl;
            cout << endl;
            cout << "Re-enter the port number you wish to connect on: " ;
            cin >> p;
            cout << endl;   
            hostport = const_cast<char*>(p.c_str());
            p0rt = atoi(hostport);

        }else{
            c_addr.sin6_port = htons(p0rt);
        }








    if(connect(connector,(sockaddr*)&c_addr,sizeof(c_addr))<0){
            printf("Connect failed with error: %d\n",GetLastError());
            string cmd;
            cout << endl;
            cout <<"Try again? Type 'y' to reattempt connection or type any other key to exit: ";
            cin >> cmd;
            cout << endl;
            if(cmd=="y"){

                goto SETUP;
            }else {
                goto QUIT;
            }


    }else{
        connected = true;
        cout << "Connected to host " << hostname << " on port " << c_addr.sin6_port << endl;
        cout << "Type 'quit' to exit the program " << endl;
    }

    while(connected==true){

       int nbr = 0;


       cout << endl;
       cout << ">";
       scanf("%s",buffer);
       cout << endl;

       string str(buffer);

       if(str==exit){

           connected = false;
           goto QUIT;
       }




       long nbs = send(connector,buffer,sizeof(buffer),0);
       if(nbs < 0){
            printf("send() failed", GetLastError());
            goto QUIT;
       }

       while(nbr < nbs){
            nbr = recv(connector,buffer,sizeof(buffer),0);
            if(nbr < 0){
                printf("recv() failed", GetLastError());
                goto QUIT;

            }else if(nbr==0){
                printf("recv() failed: connection closed prematurely", GetLastError());
                goto QUIT;              
            }else if(nbr > 0){
                cout << endl;
                cout << ">> ";
                printf(buffer);
                cout << endl;
            }

       }



    }


    QUIT:

        if (closesocket(connector) == SOCKET_ERROR) {
            printf("closesocket function failed with error: %ld\n", GetLastError());
            WSACleanup();
            return 1;
        }


    WSACleanup();

    return 0;




};


void set_interface(SOCKET s, DWORD Index){




        MIB_IF_ROW2 T2;
        NET_LUID   ID;
        DWORD ptbuflen = (DWORD)sizeof(T2); 


        ConvertInterfaceIndexToLuid(Index,&ID);
        T2.InterfaceLuid = ID;
        GetIfEntry2(&T2);



        if(WSAIoctl(s,SIO_ASSOCIATE_HANDLE,&T2,ptbuflen,NULL,0,0,NULL,NULL)>0){
            printf("WSAIoctl() function failed with error: %d\n", GetLastError());
            closesocket(s);


        }

        if(WSAIoctl(s,SIO_TRANSLATE_HANDLE,&T2,ptbuflen,NULL,0,0,NULL,NULL)>0){
            printf("WSAIoctl() function failed with error: %d\n", GetLastError());
            closesocket(s);


        }

};
#包括“stdafx.h”
#包括
#包括
#包括
#包括
#ifndef UNICODE
#定义UNICODE
#恩迪夫
#定义WIN32_精益_和_平均值
#包括
#包括
#包括
#包括
#包括
#pragma注释(lib,“ws2_32.lib”)
#pragma注释(lib,“iphlapi.lib”)
使用名称空间std;
静态int MAXPENDING=5;
void set_接口(套接字s、DWORD索引);
int main(int argc,char*argv[])
{
WSADATA WSADATA;
int结果;
int optv=1;
char*optval=(char*)&optv;
int optlen=sizeof(optval);
德沃德指数=22;
布尔连接=假;
字符串exit=“退出”;
字符串名;
sockaddr_in 6 c_addr;
c_addr.sin6_family=AF_INET6;
字符缓冲区[1024];
结果=WSAStartup(MAKEWORD(2,2)和wsaData);
如果(结果!=无错误){
printf(“WSAStartup函数失败,错误:%d\n”,GetLastError());
返回0;
}
设置:
插座连接器;
连接器=插座(AF_INET6、插座流、IPPROTO_TCP);
如果(连接器==无效的_插座){
wprintf(L“套接字函数失败,错误:%ld\n”,WSAGetLastError());
闭合插座(连接器);
返回1;
}
姓名;

你需要把你没有使用的部分归零。先把你需要的部分归零,然后填上你需要的部分

如果用户第一次未能输入有效端口,则您不会验证第二次输入的新端口,也不会将第二个端口值分配给
sockaddr\u in6
。您应该在循环中进行验证,然后将最终接受的值分配给
sockaddr\u in6


当您应该使用时,您正在使用
inet\u pton()
inet\u pton()
仅将IP地址字符串转换为二进制格式。它不会将主机名解析为IP。
getaddrinfo()
执行该解析,并且它还支持转换IP地址字符串(在
提示
参数中指定
AI_numericost
标志以获取该行为).

可能重复感谢。这似乎有效。但是sockaddr_in6结构呢?我需要指定scopeID,以便它知道接口使用什么。不,您不需要指定作用域ID。如果您想使用特定接口进行连接,那么
bind()
在调用
connect()
之前,将套接字连接到该接口的本地IP。我能够使用WSAIoctl()函数指定连接接口。感谢您的帮助。FTR:我清除了sockaddr\u in6结构,并将addrinfo结构与getaddrinfo()一起使用,这就是诀窍所在。