gpt4 book ai didi

c++ - Winsock 连接()错误 10051

转载 作者:太空宇宙 更新时间:2023-11-04 11:54:16 25 4
gpt4 key购买 nike

每次尝试使用此代码时,我都会收到 10051 套接字错误:

    USES_CONVERSION;
LPTSTR addr = A2W("192.168.1.209");
m_pSMACLPRCli = new CSMACLPRCli(addr, 12010, m_hWnd);
m_pSMACLPRCli->StartThread();

这是 m_pSMACLPRCli 的构造函数:

CSMACLPRCli::CSMACLPRCli(LPTSTR lpsztIPAddress, int nPort, HWND hParentWnd)

这就是我创建套接字和连接的方式:

void CBlockingSocket::Create(int nType /* = SOCK_STREAM */)
{
ASSERT(m_hSocket == NULL);
if ((m_hSocket = socket(AF_INET, nType, 0)) == INVALID_SOCKET)
{
TRACE("\n Socket Error !1 (%d)\n", WSAGetLastError());
int err = WSAGetLastError();
}
}


BOOL CBlockingSocket::Connect(LPCSOCKADDR psa)
{
ASSERT(m_hSocket != NULL);
// should timeout by itself
if (connect(m_hSocket, psa, sizeof(SOCKADDR)) == SOCKET_ERROR)
{
int nLastErr = WSAGetLastError();
return FALSE;
}

return TRUE;
}

真正有趣的是,当我在 VS2008 项目中使用完全相同的代码、类结构等时,一切都按预期工作,但是当我在 VS2010 项目中使用它时,在 connect()我收到 10051 错误,Network is unreachable .

编辑:原始 VS2010 项目。使用 UNICODE 编译.我使用 MULTI-BYTE 制作了一个新的 VS2010用于测试和 connect()方法不返回错误,并且...连接。我将地址字符串传递给构造函数的方式有问题吗?

USES_CONVERSION;
LPTSTR addr = A2W("192.168.1.209");
m_pSMACLPRCli = new CSMACLPRCli(addr, 12010, m_hWnd);
m_pSMACLPRCli->StartThread();

已解决:

真正的问题不是 connect()方法,但与我将地址字符串传递给 sockaddr 的构造函数的方式有关对象。

构造函数:

CSockAddr(const char *pchIP, const USHORT ushPort = 0) // dotted IP addr string
{
sin_family = AF_INET;
sin_port = htons(ushPort);
sin_addr.s_addr = inet_addr(pchIP);
}

我使用的构造函数调用:

 CString m_strSrvIPAddr;    
CSockAddr saServer((char *) LPTSTR(LPCTSTR(m_strSrvIPAddr)), USHORT(m_nPort));

我把调用改成了这样:

CStringA strAddr(m_strSrvIPAddr);
CSockAddr saServer((const char *) strAddr, USHORT(m_nPort));

所以我必须对 UNICODE 中的字符串进行转换至 MULTI_BYTE .

最佳答案

调用connect()时,需要使用sizeof(SOCKADDR_IN)sizeof(SOCKADDR_IN6),具体取决于psa 实际上是指向。我建议让调用者传入实际大小值:

BOOL CBlockingSocket::Connect(LPCSOCKADDR psa, int sasize)
{
ASSERT(m_hSocket != INVALID_SOCKET);
// should timeout by itself
if (connect(m_hSocket, psa, sasize) == SOCKET_ERROR)
{
int nLastErr = WSAGetLastError();
return FALSE;
}

return TRUE;
}

SOCKADDR_IN sa;
...
Connect((LPSOCKADDR)&sa, sizeof(sa));

或者,最好使用 SOCKADDR_STORAGE 并在将其传递给 connect() 时对其进行类型转换:

BOOL CBlockingSocket::Connect(const SOCKADDR_STORAGE *psa)
{
ASSERT(m_hSocket != INVALID_SOCKET);
// should timeout by itself
if (connect(m_hSocket, (LPCSOCKADDR)psa, sizeof(SOCKADDR_STORAGE)) == SOCKET_ERROR)
{
int nLastErr = WSAGetLastError();
return FALSE;
}

return TRUE;
}

SOCKADDR_STORAGE sa;
...
Connect(&sa);

关于c++ - Winsock 连接()错误 10051,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16839782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com