资源简介
操作系统课程项目,在linux下用c语言实现了多线程web服务器。可以选择不同的调度算法,来执行web请求,有FCFS, SJF。采用线程池设计思想实现。
代码片段和文件信息
#include
#include
#include
#include
#include
#include“myhttpd.h“
#include“queue.h“
#include“schedule.h“
#include“process.h“
#include“option.h“
control* initializeControl ( );
void releaseResource ( control* cntl );
void usage ( void );
int main(int argc char* argv[])
{
choose(&argc argv);
int ret i;
gClientSockfd = 0;
if(option.help == 1)
{
usage();
exit(0);
}
if(option.debug == 1)
{
option.log = 0;
}
else
{ /* make the process daemon */
pid_t p;
p = fork();
if ( p < 0 )
printError ( “cannot fork new process“ );
else if ( p != 0 )
exit ( 0 );
setsid ( );
chdir ( option.rootDirectory );
umask ( 0 );
}
if ( option.log == 1)
{
/* the log file should be in the log directory which is the source file directory*/
strcat ( option.logDirectory “/“ );
strcat ( option.logDirectory option.logFilename );
}
/* initialize the global control struct */
control* cntl = initializeControl ();
/* setup the server sock */
gSockfd = socket( AF_INET SOCK_STREAM 0 );
if ( gSockfd < 0 )
printError(“printError opening socket“);
struct sockaddr_in serverAddr;
bzero( (char* ) &serverAddr sizeof(serverAddr) );
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = INADDR_ANY;
serverAddr.sin_port = htons(option.port);
ret = 1;
setsockopt ( gSockfd SOL_SOCKET SO_REUSEADDR &ret sizeof(ret) );
if ( bind( gSockfd (struct sockaddr *) &serverAddr sizeof(serverAddr) ) < 0 )
printError(“cannot bind“);
listen ( gSockfd 10 );
pthread_t exeThread[option.threadNum];
pthread_t queueThread;
pthread_t schedThread;
/* create execution thread */
for ( i = 0 ; i < option.threadNum ; i++ )
{
ret = pthread_create( &exeThread[i] NULL execute cntl );
if ( 0 != ret )
printf(“cannot create execution thread No.%d“ i );
}
/* create queue thread and schedule thread */
cntl->queueLength++;
ret = pthread_create( &queueThread NULL queue cntl );
if ( 0 != ret )
printError(“cannot create queuing thread“);
sleep ( option.queuingTime );
cntl->queueLength--;
ret = pthread_create( &schedThread NULL schedule cntl );
if ( 0 != ret )
printError(“cannot create scheduling thread“);
/* release request queue */
if ( option.debug )
{
char final[20];
scanf ( “%s“ final );
if ( 0 == strncmp ( final “exit“ 4 ) )
{
close ( gSockfd );
releaseResource ( cntl );
return 0;
}
}
else
{
/* wait for the other threads to complete */
pthread_join ( queueThread NULL );
pthread_join ( schedThread NULL );
for ( i = 0 ; i < option.threadNum ; i++ )
pthread_join ( exeThread[i] NULL );
}
}
/*print error message and exit*/
void printError(const char* msg)
{
perror(msg);
exit(1);
}
void getTime ( char* str )
{
char ntime[64];
struct tm* now;
time_t tm;
time ( &tm );
now = gmtime ( &tm );
strftime ( ntime sizeof(ntime) “[ %d/%b/%Y:%H:%M:%S -0400]“ now );
strcpy( str ntim
- 上一篇:基于Qt的2048游戏实现
- 下一篇:椭圆曲线密码ECC算法实现源码C++
相关资源
- vs2008(mfc)通过ADO连接SQL SERVER 2008源
- web服务器socklib
- MFC连接SqlServer数据库,并将查询的数
- 简单科研管理系统-----数据库课程设计
- WebPage.h和WebPage.cpp
- 基于boost.asio库的C++http/https web server
- linux局域网聊天软件server+client 源码
- windows下C++实现的HTTP web 服务器
- C++、SOAP实现调用webservice接口,上传文
- c++使用webbrowser
- VS2013 MFC ODBC连接SQL SERVER数据库编程完
- Linux- 用C语言实现的简单Web服务器源代
- MODBUS TCP SERVER 源码
-
C++中使用CWebPage调用ja
vasc ript - OpenSSL+VC6.0 实现的安全Web Server 客户端
- 一个好用的C++编写的websocket服务端d
- IOCP SOCKETserver and client 并且内]
- WebBench(c++版本)
- linux下C语言实现简易web服务器
- BCB 调用WebService方法及常见问题排查
- C++获取网络时间
- C++ADO连接SQLServer封装类
- GE OPC Server
- vc++ tcp 客户端和服务器端
- c++ 连接sql server 数据库代码
- 学生信息管理系统+MFC+VC6+SQLServer
- C语言实现简单的web服务器
- MFC sql server的ADO及ODBC连接操作
- 基于Linux C语言的多线程模拟智能家具
- MFC中使用ADO连接SQL Server 2008 R2
评论
共有 条评论