connect()C函数无法与我的路由器连接,但我可以使用javascript ajax调用
我正在编写一个C应用程序来连接路由器。路由器不会过滤任何传入连接,也不会过滤任何防火墙。我的问题是C函数“连接”返回SOCKET_ERROR,但是当发生这种情况时,我得到调用perror的错误消息是:没有错误(?)。这可能意味着我正在寻找错误的方向(perror从中获得错误信息的地方不是我感兴趣的地方)。connect()C函数无法与我的路由器连接,但我可以使用javascript ajax调用
UPDATE:如意见建议,我叫WSAGetLastError(),返回10061(connection refused)
在同一时间,我有与路由器连接的Web应用程序,并通过发送一个JSON消息AJAX呼叫。没有问题。使用相同的IP和相同的端口进行连接。
如果有帮助,我使用的connect
函数在WinSock2.h中定义。与Windows 7家庭高级版和Visual Studio 2010
工作这些是我所认为的代码的相关部分(UPDATE:增加套接字初始化的缺失部分)
// Enters here
#ifdef WIN32
WSADATA wsaData;
int error = WSAStartup(MAKEWORD(2,0), &wsaData);
if(error != 0) return false;
if(LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 0)
{
WSACleanup();
return false;
}
#endif
struct addrinfo hints;
struct addrinfo *m_data;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_socktype = SOCK_STREAM;
// hostname is a char * containing my IP, in the same subnetwork than the router,
// and I'm going to connect with 192.168.90.1 (connection correctly open) and port 5555
port = "5555";
getaddrinfo(hostname, port, &hints, &m_data);
int m_socket = socket(m_data->ai_family, m_data->ai_socktype, m_data->ai_protocol);
// more stuff here
if (connect(m_socket, (struct sockaddr *)m_data->ai_addr, m_data->ai_addrlen) == SOCKET_ERROR)
{
// I get "connection error: no error" here. Why?
perror("connection error");
closesocket(m_socket);
return false;
}
那么,为什么我通过AJAX调用连接,但C连接函数返回SOCKET_ERROR?任何线索?
非常感谢提前
你忘了设置协议。
hints.ai_protocol = IPPROTO_TCP;
此外,你应该尝试初始化Winsock到版本2.2。
我如何使用Winsock连接的片段。
#ifdef WIN32
WSADATA wsaData;
int error = WSAStartup(MAKEWORD(2,2), &wsaData);
if(error != 0) return false;
if(LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
{
WSACleanup();
return false;
}
#endif
SOCKADDR_IN sin;
LPHOSTENT lpHost = gethostbyname(hostname);
bool bRet = false;
if(NULL != lpHost) {
m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
sin.sin_family = AF_INET;
sin.sin_port = htons(5555);
sin.sin_addr.S_un.S_addr = *(unsigned __int32*)lpHost->h_addr;
if(connect(m_socket, (SOCKADDR*)&sin,
sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
{
perror("connection error");
closesocket(m_socket);
} else bRet = true;
}
return bRet;
我忘了粘贴套接字初始化部分。但无论如何,非常感谢该片段! – jorgeas80
非常欢迎。的xD –
使用'WSAGetLastError'获取错误代码。 – nwellnhof
获取10061,根据http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx表示“连接被拒绝”。但阿贾克斯连接工作正常。 – jorgeas80
添加用于初始化套接字的缺失代码。 – unwind