thetux4
thetux4

Reputation: 1633

Multi-clients on a server

For an application in C, i need to response more than one clients.

I setup the connection with a code like,

    bind(...);
    listen(...);
    while(1){
        accept(...);//accept a client
        recv(...);//receive something
        send(...);//send something to client
        bzero(buf);//clear buffer
    }  

This works great when i have only one client. Other clients also can connect to the server but although they command something, server does not response back to clients who connected after the first client. How can i solve this problem?

Upvotes: 0

Views: 1088

Answers (3)

Zan Lynx
Zan Lynx

Reputation: 54355

Write a server using asynchronous, nonblocking connections.

Instead of a single set of data about a client, you need to create a struct. Each instance of the struct holds the data for each client.

The code looks vaguely like:

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

If any of your calls return the error EAGAIN instead of success then don't panic. You just try again later. Be prepared for EAGAIN even if poll claims the socket is ready: it's good practice and more robust.

Upvotes: 2

Ptival
Ptival

Reputation: 9437

Basically you want your main thread to only do the accept part, and then handle the rest to another thread of execution (which can be either a thread or a process).

Whenever your main thread returns from "accept", give the socket descriptor to another thread, and call accept again (this can be done with fork, with pthread_create, or by maintaining a thread pool and using synchronization, for instance condition variables, to indicate that a new client has been accepted).

While the main thread will handle possible new clients incoming, the other threads will deal with the recv/send.

Upvotes: 0

Sadique
Sadique

Reputation: 22841

i need to response more than one clients.

Use Threading.

Upvotes: 0

Related Questions