c++ Sockets不能正常工作

C++ Sockets Does Not Work Properly

本文关键字:工作 常工作 Sockets 不能 c++      更新时间:2023-10-16

再次返回(对不起)

我创建了一个套接字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()。试试这个:

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...
}

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