0

我有一个将连接到服务器的 VPN 应用程序。在以太网和 Wifi 的情况下工作正常。现在我正在尝试连接 USB 适配器(USB dongle)。当我尝试连接时,出现套接字连接错误。但这个套接字在其他情况下工作正常。

到这里时出错:

result = tfConnect(my_Socket , (struct sockaddr*) &aAddress, sizeof(struct sockaddr_in6));

这是我完整的套接字连接代码。

FILTER_RECORD filterRecord;
struct sockaddr_storage aAddress;
int result = TM_ENOERROR;
u32_t status = ERROR_SUCCESS;


/*socket creation */

my_Socket = tfSocket(PF_INET6, SOCK_STREAM, IPPROTO_TCP);

    if (my_Socket  == TM_SOCKET_ERROR) {
        goto exitConnect;
    }

MZeroMemory(&filterRecord, sizeof(FILTER_RECORD));

filterRecord.nType = PF_TYPE_SYSTEM;
filterRecord.nDirection = PF_DIRECTION_IN;
filterRecord.nAction = PF_ACTION_FILTER;
filterRecord.nEthProto = IPV6_IS_IPV4_MAPPED_ADDRESS(*pDstIp) ? ETH_PROTO_IPV4 : ETH_PROTO_IPV6;
filterRecord.nIpProto = IP_PROTO_TCP;
IPV6_SET_IPV6_ADDRESS(filterRecord.aSrcIp, *pDstIp);
IPV6_IPV6_PREFIX_LENGTH_TO_IPV6_NET_MASK(128, filterRecord.aSrcIpMask);
IPV6_SET_IPV6_ADDRESS(filterRecord.aDstIp, *pSrcIp);
IPV6_IPV6_PREFIX_LENGTH_TO_IPV6_NET_MASK(128, filterRecord.aDstIpMask);
filterRecord.nSrcPort = nDstPort;
filterRecord.nDstPort = nSrcPort;
m_nFilterId = Filter::Add(&filterRecord);


MZeroMemory(&aAddress, sizeof(struct sockaddr_storage));
aAddress.ss_family = PF_INET6;
IPV6_SET_IPV6_ADDRESS(*((PIPV6_ADDRESS) &aAddress.addr.ipv6.sin6_addr), *SrcIp);
aAddress.addr.ipv6.sin6_scope_id = ScopeId;
aAddress.ss_port = SrcPort;

/* binding */

result = tfBind(my_Socket , (struct sockaddr*) &aAddress, sizeof(struct sockaddr_in6));

    if (result == TM_SOCKET_ERROR) {
        goto exitConnect;
    }

result = tfSetsockopt(my_Socket , SOL_SOCKET, SO_BINDTODEVICE, szName, ISystem::StrLen(szName));

    if (result == TM_SOCKET_ERROR) {
        goto exitConnect;
    }

nTimeout = m_nTimeout / 1000;

result = tfSetsockopt(my_Socket , IP_PROTOTCP, TCP_MAXRT, (const char*) &nTimeout, sizeof(nTimeout));

    if (result == TM_SOCKET_ERROR) {
        goto exitConnect;

    }

// configuring TCP_KEEPALIVE scheme

nValue = TCP_KEEPALIVE_COUNT;

result = tfSetsockopt(my_Socket , IP_PROTOTCP, TM_TCP_KEEPALIVE_CNT, (const char*) &nValue, sizeof(nValue));

    if (result == TM_SOCKET_ERROR) {
        goto exitConnect;
    }

nValue = TCP_KEEPALIVE_INTERVAL;

result = tfSetsockopt(my_Socket , IP_PROTOTCP, TM_TCP_KEEPALIVE_INTV, (const char*) &nValue, sizeof(nValue));

    if (result == TM_SOCKET_ERROR) {
        goto exitConnect;
    }

nValue = TCP_KEEPALIVE_TIMEOUT;

result = tfSetsockopt(my_Socket, IP_PROTOTCP, TCP_KEEPALIVE, (const char*) &nValue, sizeof(nValue));

    if (result == TM_SOCKET_ERROR) {
        goto exitConnect;
    }

nValue = 1;

result = tfSetsockopt(my_Socket , SOL_SOCKET, SO_KEEPALIVE, (const char*) &nValue, sizeof(nValue));

    if (result == TM_SOCKET_ERROR) {
        goto exitConnect;
    }

nValue = 524288; 

result = tfSetsockopt(my_Socket , SOL_SOCKET, SO_RCVBUF, (const char*) &nValue, sizeof(nValue));

    if (result == TM_SOCKET_ERROR) {
        goto exitConnect;
    }

nValue = 524288;

result = tfSetsockopt(my_Socket , SOL_SOCKET, SO_SNDBUF, (const char*) &nValue, sizeof(nValue));

    if (result == TM_SOCKET_ERROR) {
        goto exitConnect;
    }


MZeroMemory(&lingerOpts, sizeof(lingerOpts));

result = tfSetsockopt(my_Socket , SOL_SOCKET, SO_LINGER, (const char*) &lingerOpts, sizeof(lingerOpts));

    if (result == TM_SOCKET_ERROR) {
        goto exitConnect;
    }

nValue = 1;

result = tfSetsockopt(my_Socket , IP_PROTOTCP, TCP_NODELAY, (const char*) &nValue, sizeof(nValue));

    if (result == TM_SOCKET_ERROR) {
        goto exitConnect;
    }


result = tfBlockingState(my_Socket , TM_BLOCKING_ON);

    if (result == TM_SOCKET_ERROR) {

    goto exitConnect;

    }

MZeroMemory(&aAddress, sizeof(struct sockaddr_storage));


aAddress.ss_family = PF_INET6;
IPV6_SET_IPV6_ADDRESS(*((PIPV6_ADDRESS) &aAddress.addr.ipv6.sin6_addr), *pDstIp);
aAddress.addr.ipv6.sin6_scope_id = nScopeId;
aAddress.ss_port = nDstPort;


result = tfConnect(my_Socket , (struct sockaddr*) &aAddress, sizeof(struct sockaddr_in6));

    if (result == TM_SOCKET_ERROR) {

    --- /* GETTING ERROR HERE */ ----

    goto exitConnect;

    }


exitConnect:

    if ((status != ERROR_SUCCESS) && (!m_fClosed)) {

        Disconnect();
    }

为什么会这样?USB适配器的任何特定插座配置?应该使用任何 RAW Socket,例如

my_Socket = tfSocket(PF_INET6, SOCK_RAW, IPPROTO_RAW);

但是为什么其他人工作正常而没有错误并且只有连接失败?任何想法 ?请帮我 。

4

0 回答 0