跳至正文

Http服务器正式版

  • 技术
  经过昨天一晚上的奋斗+今天一早上的奋斗,服务器总算是能够真正的使用了。
昨晚上:
  今天晚上拼了命在写服务器,打算把进程池写出来,反复的翻Unix 环境高级编程,天啊,进程之间的通信真的很麻烦,没对进程都需要两个管道(如果需求移植能力强的话是2个,不然可以是1个。)然后我就放弃了,考虑线程池,但是不知道怎么样调度线程,后来翻到了线程可以单独接收信号,打算从这里下手,写了好久,把线程锁,信号集都用上了,但是还是Failed了。最后打算直接使用线程锁+数据的正负性来下手(程序的效率不会高的,因为每个线程都有可能加锁然后发现数值错误,再解锁。),正在撰写中。
  忽然想到了另外一种方法,用进程池,之间直接使用信号来管理,思路不错,但是等线程池失败了再考虑。
  线程池的成功了,不过前面的一种方法,就是使用信号的,也不一定失败了,因为我之前写的时候掉了一个函数,现在再试试这种效率高的方法。
  很可惜,还是失败了,那我就先用那种效率低的方法吧。。
  最后发现竟然是机子的问题,我把服务客户的函数去掉了,不过不知道为什么,accept只能接受一个客户请求。。只好明天早上再写了(现在已经00:30了.)
今天早上:
  把需要的函数加上后,尝试了昨天的两种线程调度的方法,第一种还是失败了,sigwait的用法还是不够清楚,我就直接使用了第二种,使用线程锁,主线程一直锁上,tmpsock=-1,然后其他的线程再为锁而睡眠,当主线程接收到客户,就把全局变量tmpsock设置成套接字文件描述父,就把锁释放,然后马上夺取。然后其他线程也会夺取这个线程锁,主线程得到锁之后判断tmpsock是否为-1,如果是就返回主函数,否则放锁再夺取,其他线程判断tmpsock是否为-1,如果是就放缩,否则就把这个套接字设为自己的,然后置tmpsock为-1,然后对客户发送Html文件。
  此方案已经成功了,不过效率可能不高,因为可能一直是主线程得锁,又放锁;还可能是一个线程得到套接字文件描述符之后,其他的线程反反复复的再得锁又防锁(解锁)。
  但总之这个方案已经实现了,自己挺自豪的,这样服务器就成为了真正的并发服务器。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注