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?任何线索?

非常感谢提前

+0

使用'WSAGetLastError'获取错误代码。 – nwellnhof

+0

获取10061,根据http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx表示“连接被拒绝”。但阿贾克斯连接工作正常。 – jorgeas80

+0

添加用于初始化套接字的缺失代码。 – unwind

你忘了设置协议。

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; 
+0

我忘了粘贴套接字初始化部分。但无论如何,非常感谢该片段! – jorgeas80

+0

非常欢迎。的xD –