关于多进程服务器处理并发性问题
AIX下我用端口重用方式将多个进程绑定监听一个端口,
每个进程独立做一样的业务处理
子进程具体流程如下:
for(;;)
{
1. 建立套接字。
2. 设置地址端口重用。
3. 设置套接字为非阻塞方式
4. 绑定 // bind(sockfd, (struct sockaddr *)&polladdr, sizeof(struct sockaddr_in));
5. 监听 //listen(sockfd, SOMAXCONN);
6. 接受连接 //accept(sockfd, (struct sockaddr *)NULL, NULL);
7. 关闭listen套接字
8. 处理业务(recv() send())
}
现在的问题是这样的,在第6步accept时(取队列中的一条),建立三路握手的其他连接已经在队列中(可能有多条),只有做第7步
关闭listen套接字后,才不会再接收连接
当并发执行的时候,发现有客户端通讯失败的情况
我把listen(sockfd, SOMAXCONN); 改成listen(sockfd, 0); 但会出现客户端没法连接的问题
创建了多个这样的进程后(比如15个),测试并发10笔,发现有几个进程是空闲的,但还是有通讯错误的问题
我想应该是上面说的原因.
怎么样才能让一个进程一次只接收处理一个连接呢,谢谢