关于多进程服务器处理并发性问题

threadpaper 2008-09-09 10:54:25
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笔,发现有几个进程是空闲的,但还是有通讯错误的问题
我想应该是上面说的原因.

怎么样才能让一个进程一次只接收处理一个连接呢,谢谢
...全文
460 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
check_up 2009-02-18
  • 打赏
  • 举报
回复
int nLisSock, nSock; /*侦听套接字和连接套接字描述符*/
pid_t nChild;
/*-----------------父进程----------------*/
CreateSock(&nLisSock, PORT,MAX);/*创建侦听套接字*/
InitServer();/*转后台*/
while (1)
{
assert(AcceptSock(&nSock,nLisSock) ==0);/*创建连接套接字*/
VERIFY((nChild=fork())>=0);/*创建子进程*/
if(nChild==0) break;/*子进程转到子进程代码*/
close(nSock);/*父进程关闭连接套接字*/
}
/*----------子进程-----------*/
close(nLisSock);
/*--------数据通信开始------------*/
/*--------------数据通信结束--------------*/
close(nSock); /*子进程关闭连接套接字*/
这是从关云翔编的UNIX下C语言编程与项目实践学来的
可一容纳无限连接,只要你的机子允许
zbing0203 2009-01-12
  • 打赏
  • 举报
回复
楼主的签名图很有诱惑力
lala_benben 2009-01-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 luolaigen2008 的回复:]
fork。接受连接后fork子进程处理。
也可以参考ACE模式,select/epoll模式能力更强。
[/Quote]

顶这个
K行天下 2008-09-19
  • 打赏
  • 举报
回复
up
luolaigen2008 2008-09-19
  • 打赏
  • 举报
回复
fork。接受连接后fork子进程处理。
也可以参考ACE模式,select/epoll模式能力更强。
budweiser 2008-09-10
  • 打赏
  • 举报
回复
帮顶

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧