对于C语言中的应用程序,我需要响应多个客户端。
我使用类似
的代码设置连接 bind(...);
listen(...);
while(1){
accept(...);//accept a client
recv(...);//receive something
send(...);//send something to client
bzero(buf);//clear buffer
}
当我只有一个客户时,这很有用。其他客户端也可以连接到服务器,但是虽然它们命令某些东西,但服务器不会响应在第一个客户端之后连接的客户端。我该如何解决这个问题?
答案 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。