使用非阻塞套接字在服务器中处理请求

时间:2015-05-05 10:17:05

标签: c multithreading sockets pthreads

我试图实现一个简单的服务器。服务器使用非阻塞套接字和线程池来处理每个请求。目前,我正在使用监视器和事件队列来处理传入的请求。我无法定义我的活动应该是什么 - 现在它的结构是:

struct eventQueueNode {
int clientSocket;
void (*processClient)(void * arg);  
eventQueueNode *next;

};

只要套接字准备好读取,主线程就会将这些事件放入队列中。工作人员从队列中拾取它,从套接字读取请求,然后发送回复。

我这个沟通的基本协议是:

客户端向服务器发送表单请求:

FETCH some-data-name

后面跟着两个换行符来表示传输结束。 服务器回复所需数据,然后回复2个换行符。

现在,所有处理此请求(从套接字读取,解析,查询数据,发送响应)都由工作线程处理。这是正确的做法吗?

困扰我的是什么:

假设队列中有4个工作线程和4个来自同一用户的事件。工作人员选择请求并同时读取和写入同一个套接字。这会导致脏读/写吗? (例如,一个线程获取客户端请求的一部分,而另一个线程获取其余线程,因此不会对无效请求产生响应)。在我阅读完整请求之前,我应该在这些描述符上使用互斥锁吗?另一个想法是在主线程中读取请求并将请求本身放入事件队列中。然后工作人员只需要写入套接字(我还需要一个互斥锁吗?)。

0 个答案:

没有答案
相关问题