2013-06-12 181 views
0

回來了(對不起)C++套接字不能正常工作

我創建了一個插座C++應用程序,但它不能正常工作。

這是我的第一個代碼:

void Network::Start() 
{ 
    this->socket = Env::GetSocket(); 

    SOCKADDR_IN sInformation; 

    sInformation.sin_family = AF_INET; 
    sInformation.sin_addr.s_addr = INADDR_ANY; 
    sInformation.sin_port = htons(30000); 

    bind(this->socket, (SOCKADDR*) (&sInformation), sizeof(sInformation)); 
    listen(this->socket, 10); 

    while (true) 
    { 
     this->DO(); 
    } 
} 

和DO功能:

void Network::DO() 
{ 
    SOCKET s = SOCKET_ERROR; 

    sockaddr_in sock_addr; 

    accept(s, (sockaddr*) &sock_addr, NULL); 

    if (INVALID_SOCKET == s) 
    { 
     return; 
    } 
    else 
    { 
     cout << "Received connection from " << inet_ntoa(sock_addr.sin_addr); 
    } 
} 

會發生什麼事,總是(即使我連接)S的值INVALID_SOCKET。我通過.SWF連接,但不接受我的連接。我究竟做錯了什麼?

+2

你需要做的'S =接受(這個 - >插座...' – ctn

+0

@ctn你應該張貼,作爲一個答案 – Barmar

+0

接受並返回一個整數,而不是一個套接字對象 –

回答

1

您沒有做足夠的錯誤處理,並且您沒有正確使用accept()。試試這個:

void Network::Start() 
{ 
    this->socket = Env::GetSocket(); 
    if (this->socket == INVALID_SOCKET) 
    { 
     // error 
     return; 
    } 

    SOCKADDR_IN sInformation = {0}; 

    sInformation.sin_family = AF_INET; 
    sInformation.sin_addr.s_addr = INADDR_ANY; 
    sInformation.sin_port = htons(30000); 

    if (bind(this->socket, (SOCKADDR*) &sInformation, sizeof(sInformation)) != 0) 
    { 
     // error 
     return; 
    } 

    if (listen(this->socket, 10) != 0) 
    { 
     // error 
     return; 
    } 

    while (true) 
    { 
     this->DO(); 
    } 
} 

void Network::DO() 
{ 
    SOCKADDR_IN sock_addr = {0}; 
    socklen_t sock_addr_len = sizeof(sock_addr); 

    SOCKET s = accept(this->socket, (SOCKADDR*) &sock_addr, &sock_addr_len); 
    if (INVALID_SOCKET == s) 
    { 
     return; 
    } 

    cout << "Received connection from " << inet_ntoa(sock_addr.sin_addr); 

    // use s as needed. Don't forget to call close(s) or closesocket(s) 
    // when finished, depending on your platform... 
} 
+0

現在說這個 - >插座== INVALID_SOCKET, DWORD信封:: GetSocket(){ \t回插座(AF_INET,SOCK_STREAM,IPPROTO_TCP); } 它有什麼問題? –

+0

'socket()'返回一個'SOCKET',而不是'DWORD'。如果你遇到編譯器錯誤,你可能需要進行類型轉換:'return(DWORD)socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);'''this-> socket =(SOCKET)Env :: GetSocket();'如果你是仍然有問題,那麼請提供**實際的錯誤信息**。 –

+0

現在有效,謝謝雷米。 –

1

accept以監聽套接字爲參數,並且返回新連接的套接字;

socklen_t length = sizeof(sockaddr_in); 
s = accept(this->socket, (sockaddr*) &sock_addr, &length); 

編輯:只是測試的程序,用AF_INET創建,SOCK_STREAM和sInformation清除出插座;

bzero((char *) &sInformation, sizeof(sInformation)); 

......它似乎在MacOS X和Linux上運行良好。

+0

仍然沒有效果 –

+0

@x_metal_pride_diamond_x症狀是否改變 –

+0

沒有,真的還是一樣 –