C 套接字服务器不接受任何客户端 /客户端无法连接



我有一个简单的类,它启动了服务器并向客户端倾听,并且在他们连接后为他们启动线程,我的问题是,当我运行服务器时,它似乎正在侦听和当我尝试使用简单的Python代码连接时,服务器不接受套接字。

显然我认为问题与客户连接有关,但是在尝试更改以从环回到本地地址的地址后,我得到了相同的结果,所以我不确定是什么原因引起的。

服务器代码:

Communicator::Communicator()
{
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
    {
        throw std::runtime_error("Failed to startup WSA");
    }
    m_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (m_sock == INVALID_SOCKET)
    {
        throw std::runtime_error("Failed to create socket");
    }
}

Communicator::~Communicator()
{
    try
    {
        WSACleanup();
        closesocket(m_sock);
    }
    catch (...) {}
}
void Communicator::bindAndListen()
{
    SOCKADDR_IN sa;
    sa.sin_port = Config::getConfig()["port"]; // 8080
    sa.sin_family = AF_INET;
    sa.sin_addr.s_addr = INADDR_ANY;
    if (bind(m_sock, (const SOCKADDR*) & sa, sizeof(sa)) == SOCKET_ERROR)
    {
        throw std::runtime_error("Failed to bind socket");
    }
    if (listen(m_sock, SOMAXCONN) == SOCKET_ERROR)
    {
        throw std::runtime_error("Failed to start listening");
    }
    std::cout << "Listening" << std::endl; // This gets printed
    while (true)
    {
        SOCKET clientSock = accept(m_sock, NULL, NULL); // Nothing accepted, program stuck here
        std::cout << "Connection" << std::endl;
        if(clientSock == INVALID_SOCKET)
        { 
            throw std::runtime_error("Invalid connection");
        }
        startThreadForNewClient(clientSock);
    }
}

测试Python代码:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP)
s.connect(('127.0.0.1', 8080))
s.send(b"h")

我遇到的唯一错误是我的客户端上的[WinError 10061] No connection could be made because the target machine actively refused it,服务器正在连续收听。

我的问题是我忘了将端口放在htons中,对不起我的新秀错误。

void Communicator::bindAndListen()
{
    SOCKADDR_IN sa;
    sa.sin_port = htons(Config::getConfig()["port"]); 
    sa.sin_family = AF_INET;
    sa.sin_addr.s_addr = INADDR_ANY;
    if (bind(m_sock, (const SOCKADDR*) & sa, sizeof(sa)) == SOCKET_ERROR)
    {
        throw std::runtime_error("Failed to bind socket");
    }
    if (listen(m_sock, SOMAXCONN) == SOCKET_ERROR)
    {
        throw std::runtime_error("Failed to start listening");
    }
    std::cout << "Listening" << std::endl;
    while (true)
    {
        SOCKET clientSock = accept(m_sock, NULL, NULL);
        std::cout << "Connection" << std::endl;
        if(clientSock == INVALID_SOCKET)
        { 
            throw std::runtime_error("Invalid connection");
        }
        startThreadForNewClient(clientSock);
    }
}

最新更新