簡體   English   中英

C ++套接字不能正常工作

[英]C++ Sockets Does Not Work Properly

再回來(對不起)

我已經創建了一個套接字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連接,但它不接受我的連接。 我究竟做錯了什么?

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上運行良好。

您沒有進行足夠的錯誤處理,並且您沒有正確使用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...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM