服务器上的多客户端

时间:2011-03-25 22:21:17

标签: c sockets client-server

对于C语言中的应用程序,我需要响应多个客户端。

我使用类似

的代码设置连接
    bind(...);
    listen(...);
    while(1){
        accept(...);//accept a client
        recv(...);//receive something
        send(...);//send something to client
        bzero(buf);//clear buffer
    }  

当我只有一个客户时,这很有用。其他客户端也可以连接到服务器,但是虽然它们命令某些东西,但服务器不会响应在第一个客户端之后连接的客户端。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

使用异步,非阻塞连接编写服务器。

您需要创建一个结构,而不是一组有关客户端的数据。 struct的每个实例都保存每个客户端的数据。

代码看起来很模糊:

socket(...)
fcntl(...) to mark O_NONBLOCK
bind(...)
listen(...)
create poll entry for server socket.
while(1) {
    poll(...)
    if( fds[server_slot].revents & POLLIN ) {
        accept(...)
        fcntl(...) mark O_NONBLOCK
        create poll and data array entries.
    }
    if( fds[i].revents & POLLIN ) {
        recv(...) into data[i]
        if connection i closed then clean up.
    }
    if( fds[i].revents & POLLOUT ) {
        send(...) pending info for data[i]
    }
 }

如果您的任何通话都返回错误EAGAIN而非成功,请不要惊慌。你以后再试一次。即使民意调查声称套接字已准备好,也要为EAGAIN做好准备:这是一种很好的做法,而且更加健壮。

答案 1 :(得分:0)

i need to response more than one clients.

使用Threading

答案 2 :(得分:0)

基本上,您希望主线程只执行accept部分,然后将其余部分处理到另一个执行线程(可以是线程或进程)。

每当主线程从“accept”返回时,将套接字描述符提供给另一个线程,并再次调用accept(这可以通过fork,使用pthread_create,或通过维护线程池和使用同步来完成,例如条件变量,表示已接受新客户。)

虽然主线程将处理可能的新客户端传入,但其他线程将处理recv / send。