2014-02-27 10 views
1

我正在編寫一個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

回答

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

我忘了粘貼套接字初始化部分。但無論如何,非常感謝該片段! – jorgeas80

+0

非常歡迎。的xD –

相關問題