Using accept() and select() at the same time?

前端 未结 3 554
余生分开走
余生分开走 2020-12-14 08:18

I\'ve got an event-driven network server program. This program accepts connections from other processes on other hosts. There may be many short-lived connections from diff

3条回答
  •  不思量自难忘°
    2020-12-14 08:48

    I'd put a listener in separate process(thread) not to mess things up. And run a worker process on another to handle existing sockets. There's no need for non-blocking listener really. And no thread overhead running 2 threads.

    It should work like that: you accept on your listener thread till it returns you a descriptor of client socket and pass it to worker which is doing all dirty read/write job on it.

    If you want to listen several ports and don't want to hold one process per listener I suggest you set your socket in O_NONBLOCK and do someth like:

    // loop through listeners here and poll'em for read
    // when read is successful call accept, get descriptor,
    // pass it to worker and continue listen
    while(1){
        foreach( serverSocket in ServerSockets ){
             if( serverSocket.Poll( 10, SelectRead ) ){
                  clientSocket = serverSocket.Accept();
                  // pass to worker here and release
             }
        }
    }
    

提交回复
热议问题