[高手请入内!!]请评估一下支持多端口连接和通信的HTTP Server的实现方案可行不可行?

jscsqb 2008-06-03 05:53:21
帮忙看一下下面的方案可不可行:
目标:实现一个HTTP Server
要求:
1. 支持最多8个端口的连接和通信
2. 其中一个端口在recv的时候,有可能是分多次接收数据的。
假如说在第n次接收数据之前,刚好又来了一个别的端口的连接请求。那么这个时候必须先处理这个连接请求,然后再接收上面的第n次的数据。也就是不管连接请求还是数据传输请求,都遵循先到先处理的原则。


for (i = 0; i<8; i++)
{
sock_fd[i] = socket (…..);
bind(….);
listen (…..);
ioctlsocket(sock,FIONBIO,&ul);
FD_ZERO (&readfd.)
FD_SET (sock_fd[i], readfd);
}
while (1)
{
backup and set readfd;
Select (……..);
for (i = 0; i<8; i++)
{
if(FD_ISSET(sock_fd[i],&readfd)
{
Accept_fd[i] = accept (sock_fd[i], ….);
If (Accept_fd[i] > 0)
{
FD_SET(Accept_fd[i]);
}
}
If (FD_ISSET(Accept_fd [i],&readfd)
{
Recv (Accept_fd [i], buff, …..);
}
}
}
...全文
114 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
linqzly 2008-06-04
  • 打赏
  • 举报
回复
楼主可以参考一些libhttpd的原代码
gezichong 2008-06-03
  • 打赏
  • 举报
回复
看到你用到一些宏,如FD_ISSET之类的,我认为这些可以用来维护服务器与客户端的连接,查看socket的状态,设置超时之类的..

对处理recv,accept并没有太大的用处.
gezichong 2008-06-03
  • 打赏
  • 举报
回复
对于你的思路,我认为没有问题,
但对于实现,我说一下我的理解..

你的accept和recv的实现太简单了..这样肯定不能实现你的功能.

8个客户,就应该定义一个客户数组,存放这8个socket,(这是全局变量)
8个端口同时通信,正常的服务器都能承受,因此可以采用多进程...也就是每accept一个客户,就fork()一个进程,对客户进行处理.
同样,recv函数,必须自己定义一个函数,来处理每个socket都必须设定一个缓存,来保存接受到的数据(或者是接受到了但服务器还没有处理的数据)

如:服务端定义一个结构体,用来维护各个客户端的信息
typedef struct{
int sockIndex;//socket索引,方便查询与对客户进行各方面的操作
int socket;//存放socket
char recvBuf[65536];//存放接受到的未处理过的数据
}SocketInfo;

然后主要就是对这个结构进行相应的操作...
gezichong 2008-06-03
  • 打赏
  • 举报
回复
就像3楼所说的,,实现起来不会那么简单..

dxing_1983 2008-06-03
  • 打赏
  • 举报
回复
理论上可行
实际看你的逻辑操作功底了
cceczjxy 2008-06-03
  • 打赏
  • 举报
回复
可以,有什么不可以的。做个队列就行了。
blackbillow 2008-06-03
  • 打赏
  • 举报
回复
为什么不用多线程?

23,107

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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