我有一个将连接到服务器的 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);
但是为什么其他人工作正常而没有错误并且只有连接失败?任何想法 ?请帮我 。