Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux C++套接字上的简单HTTP服务器_C++_Linux_Sockets_Server - Fatal编程技术网

Linux C++套接字上的简单HTTP服务器

Linux C++套接字上的简单HTTP服务器,c++,linux,sockets,server,C++,Linux,Sockets,Server,我尝试编写一个简单的linux应用程序来接受http请求。我希望能够停止监听线程,所以我使用select 调用顺序是 socket()->setsockopt()->bind()->listen()->select()->accept()->read() 当我从Chrome发送请求时,我得到451字节长的缓冲区。然后选择立即返回并成功,以及接受另一个请求。然后“read”停止线程的等待,因为它没有要读取的内容 socket() ok. listenSocke

我尝试编写一个简单的linux应用程序来接受http请求。我希望能够停止监听线程,所以我使用select

调用顺序是

socket()->setsockopt()->bind()->listen()->select()->accept()->read()
当我从Chrome发送请求时,我得到451字节长的缓冲区。然后选择立即返回并成功,以及接受另一个请求。然后“read”停止线程的等待,因为它没有要读取的内容

socket() ok. listenSocket:3
bind() ok

listen() ok
select() got ready connection
accept() ok. socket: 4
reading...
read() ok. NRead: 451

listen() ok
select() got ready connection
accept() ok. socket: 5
reading...
我做错了什么


为了学习套接字编程,哪些文章/书籍值得阅读

致以最良好的祝愿, 尤拉

以下是简化代码:

void doServer()
{
    const int trueFlag = 1;

    m_socketListen = socket(AF_INET, SOCK_STREAM, 0);
    // check m_socketListen

    nRetVal = setsockopt(m_socketListen, SOL_SOCKET, SO_REUSEADDR, &trueFlag, sizeof(int));
    // check

    struct sockaddr_in addrServer;
    bzero((char*)&addrServer, sizeof(addrServer));

    addrServer.sin_family = AF_INET;
    addrServer.sin_port = htons(DEFAULT_HTTP_PORT);
    addrServer.sin_addr.s_addr = INADDR_ANY;

    nRetVal = bind(m_socketListen, (const struct sockaddr* )&addrServer, sizeof(addrServer));
    // check

    struct sockaddr_in addrClient;
    while (true)
    {
        bzero((char*)&addrClient, sizeof(addrClient));
        unsigned int addrSize = sizeof(addrClient);

        nRetVal = listen(m_socketListen, SOMAXCONN);
        // check

        struct timeval timeout;
        timeout.tv_sec = 5;
        timeout.tv_usec = 0;

        fd_set set;
        FD_ZERO (&set);
        FD_SET (m_socketListen, &set);

        nRetVal = select (FD_SETSIZE, &set, NULL, NULL, &timeout);
        // check

        if (FD_ISSET(m_socketListen, &set))
        {
            int clientSocket = accept(m_socketListen,
                                        (struct sockaddr*)&addrClient,
                                            &addrSize);

            int NRead;
            char buffer[BUF_SIZE];
            bzero(&buffer, BUF_SIZE);

            NRead = read(clientSocket, &buffer, BUF_SIZE);

            std::cout << "read() ok. NRead: " << NRead << std::endl;
        }
    }
}

阅读文档注意MSG_DONTWAIT flag学习套接字编程值得阅读哪些文章/书籍?这样的问题是不重要的,C++的1个例外得到了它。抱歉,将不再执行此操作Readsock,&buffer,BUF_SIZE;难道你不想从新的插座上读东西吗;你只想在accept和reads之间循环,而不是sock;听力已经完成