我正在编写一个C应用程序来连接路由器。路由器不会过滤任何传入连接,也不会在任何防火墙后面。我的问题是C函数“connect”返回SOCKET_ERROR,但是当发生这种情况时我调用perror的错误消息是:没有错误(¿?)。这可能意味着我正在寻找错误的方向(perror获取错误信息的地方不是我感兴趣的地方)。
UPDATE :正如评论中所建议的,我调用了WSAGetLastError(),它返回10061(connection refused)
同时,我有一个与路由器连接的Web应用程序,并通过AJAX调用向它发送一条json消息。没问题。使用相同的IP和相同的端口进行连接。
如果有帮助,我正在使用的connect
函数是在WinSock2.h中定义的。使用Windows 7 Home Premium和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 connect函数返回SOCKET_ERROR?有线索吗?
非常感谢提前
答案 0 :(得分:0)
您忘了设置协议。
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;