Chinaunix首页 | 论坛 | 博客
  • 博客访问: 92644747
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: C/C++

2008-04-16 22:47:02

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

unsigned long get_file(char *c_File_Name,char *c_Buf)//取 html 文件内容
{
FILE *fp;
int i=0;

if((fp=fopen(c_File_Name,"rb"))==NULL)//如过打开文件失败
{
strcpy(c_Buf,"404 error, file not find!");
return strlen(c_Buf);
}

while(!feof(fp))
{
*c_Buf++=getc(fp);
i++;
}
*--c_Buf='\0';
i--;

fclose(fp);

return i;
}


main()
{
int sockfd,new_fd,port;//连接所用的接口号  子进程号 端口号
int must_link=5; //最大连接数
struct sockaddr_in my_addr;//服务端socket数据结构
struct sockaddr_in their_addr;//客户端返回的数据结构
int sin_size;
port=324;

//建立一个TCP套接口

if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
exit(1);
}
//初始化结构体,并绑定2323端口
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(port);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero),8);


/* int bind(int sockfd,const struct sockaddr * myaddr,socklen_t addrlen); 
返回:0---成功   -1---失败  
-------------------------------------------------------------------------------------
第一个参数是socket函数返回的套接口描述字;第二和第第三个参数分别是一个指向特定于协议的地址结构的指针和该地址结构的长度。
*/
//绑定套接口

if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(my_addr))==-1)
{
perror("bind");
exit(1);
}
//创建监听端口

if(listen(sockfd,must_link)==-1)
{
perror("listen");
exit(1);
}
//等待连接

while(1)
{
//如果建立连接,将产生一个全新的套接字
if((new_fd = accept(sockfd,(struct sockaddr *)&their_addr,&sin_size))==-1)
{
perror("accept");
exit(1);
}

//生成一个子进程来完成和客户端的会话,父进程继续监听
if(!fork())
{
char buff[1024];
char *command;
char send_str[102400];
char ls_send_str[102400];
int send_len;
int numbytes;
close(sockfd); 
//取得客户端的数据
if((numbytes = recv(new_fd,buff,sizeof(buff),0))==-1)
{
perror("recv");
exit(1);
}
buff[numbytes]='\0';
// printf("\n\n==command: %s ==",buff);
printf("\n\n浏览器返回:\n\n%s",buff);
//将从客户端接收到的信息再发回客户端

send_len=get_file("/usr/www/aaa.htm",ls_send_str);//取数据
sprintf(send_str,"GET /usr/www/aaa.htm HTTP/1.1\nAccept: */*\nReferer: \nAccept-Language: zh-cn\nAccept-Encoding: gzip, deflate\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)\nHost: 192.168.0.1:80\nConnection: Keep-Alive\nCookie: is_user_check=sMX9PVdlR2F22; is_language=cn\n\n %s",ls_send_str);

if(send(new_fd,send_str,strlen(send_str),0)==-1)perror("send");
close(new_fd);
// system(buff);//运行命令
exit(0);
}
close(new_fd);
}
close(sockfd);
}


//////////**** 客户端
#include //标准输入输出
#include //标准库
#include //错误处理
#include //字符串
#include 
#include 
#include //套接字
#include 
#include //文件信息

char _WWW_ROOT[]="/usr/www/";

typedef struct S_KEY_VAR//关键字 - 值 对应的数据结构
{
char Key[50];//关键字
char Var[255];//值
struct S_KEY_VAR *Next;
}KEY_VAR;

typedef struct//定义浏览器传来的信息数据结构
{
char File_Name[255];//文件名
char File_Ext_Name[50];//文件扩展名
char File_Type[20];//文件类型
char Http_Ver[5];//协议版本
}RECV_INFO;

int get_recv_info(RECV_INFO *c_Recv_Info,char *c_Recv_Data);//解析从浏览器传来的信息
unsigned long get_file(char *c_File_Name,char *c_Buf);//取 html 文件内容
//char _DEBUG='N';
char _DEBUG='Y';

main()
{

int sockfd,new_fd;//定义套接字句柄,sockfd-服务器端.new_fd-客户端
struct sockaddr_in my_addr;//定义套接字数据结构,服务器端
struct sockaddr_in their_addr;//定义套接字数据结构,客户端
int sin_size;
int numbytes;
int port_numb=803;//803 324
//建立TCP套接口
if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1)
{
if(_DEBUG=='Y')perror("socket");
exit(1);
}

//初始化结构体,并绑定 803 端口
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(port_numb);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero),8);

//绑定套接口
if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)
{
if(_DEBUG=='Y')perror("bind");
exit(1);
}

//创建监听套接口
if(listen(sockfd,10)==-1)
{
if(_DEBUG=='Y')perror("listen");
exit(1);
}

//等待连接
while(1)
{
sin_size = sizeof(struct sockaddr_in);
if(_DEBUG=='Y')perror("server is run");

//如果建立连接,将产生一个全新的套接字
if((new_fd = accept(sockfd,(struct sockaddr *)&their_addr,&sin_size))==-1)
{
if(_DEBUG=='Y')perror("accept");
exit(1);
}

//生成一个子进程来完成和客户端的会话,父进程继续监听
if(!fork())
{
RECV_INFO Recv_Info;//定义浏览器传来的信息数据结构
char buf[1024],send_head[1024],ls_send_str[102400],send_str[102400],Return_Type[20];
unsigned long send_len=0;

//读取客户端发来的信息
if((numbytes = recv(new_fd,buf,1024,0))==-1)
{
if(_DEBUG=='Y')perror("recv");
exit(1);
}

if(_DEBUG=='Y')printf("RECV:\n%s\n\n",buf);
//处理请求

if(get_recv_info(&Recv_Info,buf)!=-1)//如果取浏览器传来的信息成功
{

send_len=get_file(Recv_Info.File_Name,ls_send_str);//取数据

//产生头部数据

sprintf(send_head,"HTTP/%s 200 OK\nDate: Tue, 15 Sep 1998 15:46:19 GMT\nServer: CWS/0.0.1 Alpha\nLast-Modified: Tue, 15 Sep 1998 15:46:20 GMT\nETag: W/\"d-150a-3b7f8cd0\"\nAccept-Ranges: bytes\nContent-Length: %d\nKeep-Alive: timeout=15, max=100\nConnection: Keep-Alive\nContent-Type: %s\n\n",Recv_Info.Http_Ver,send_len,Recv_Info.File_Type);

strcpy(send_str,send_head);//复制头部
memcpy(&send_str[strlen(send_head)],ls_send_str,send_len);//拼接

// printf("\n\n------%s-----\n\n",send_str);

send_len+=strlen(send_head);//计算发送字符串长度
if(_DEBUG=='Y')printf("\n~~~~~~~~~~~~~~~\n%s FileName:%s\n---------------\n",send_head,Recv_Info.File_Name);
}

//发送信息给客户端
if(send(new_fd,send_str,send_len,0)==-1)
if(_DEBUG=='Y')perror("send");

close(new_fd);
exit(0);
}
close(new_fd);
}
close(sockfd);

}

int get_recv_info(RECV_INFO *c_Recv_Info,char *c_Recv_Data)//解析从浏览器传来的信息
{
char *p_File_Name=c_Recv_Info->File_Name;//定义一个指针指向 c_Recv_Info->File_Name
char *p_File_Ext_Name=c_Recv_Info->File_Ext_Name;//定义一个指针指向 c_Recv_Info->File_Ext_Name
char *p_Http_Ver=c_Recv_Info->Http_Ver;//定义一个指针指向 c_Recv_Info->Http_Ver
int ls_ext_flag=0;

strcpy(p_File_Name,_WWW_ROOT);//复制系统定义的 WEB 跟目录
*(p_File_Name+=strlen(_WWW_ROOT));//移动指针到 WEB 跟目录之后

while(*c_Recv_Data!='\0')//遍历字符串
{
if(*c_Recv_Data++=='G')//查找文件名所在位置
{
if(*c_Recv_Data++=='E')
{
if(*c_Recv_Data++=='T')
{
if(*c_Recv_Data++==' ')
{
while(*c_Recv_Data!=' '&&*c_Recv_Data!='\0')//开始获取文件名
{
if(ls_ext_flag==1)
{
*p_File_Ext_Name++=*c_Recv_Data;
}
if(*c_Recv_Data=='.')
{
ls_ext_flag=1;
}
*p_File_Name++=*c_Recv_Data++;
}
*p_File_Name='\0';//结束字符串
*p_File_Ext_Name='\0';//结束字符串
// *c_Recv_Data--;
*c_Recv_Data++;
}// ' '
}// T
}// E
}//G

//GET /8ls/botton.css HTTP/1.1
//GET /index1.html HTTP/1.1

if(*c_Recv_Data++=='H')//查找文件名所在位置
{
if(*c_Recv_Data++=='T')
{
if(*c_Recv_Data++=='T')
{
if(*c_Recv_Data++=='P')
{
if(*c_Recv_Data++=='/')
{
while(*c_Recv_Data!='\n'&&*c_Recv_Data!='\0')//开始获取文件名
{
*p_Http_Ver++=*c_Recv_Data++;
}
*--p_Http_Ver='\0';//结束字符串
*c_Recv_Data--;
}// /
}//P
}// T
}// T
}//H

}//while



if(!strcmp(c_Recv_Info->File_Ext_Name,"html")||!strcmp(c_Recv_Info->File_Ext_Name,"htm"))
{
strcpy(c_Recv_Info->File_Type,"text/html");
}
else if(!strcmp(c_Recv_Info->File_Ext_Name,"gif")||!strcmp(c_Recv_Info->File_Ext_Name,"jpg"))
{
strcpy(c_Recv_Info->File_Type,"image/gif");
}
else
{
strcpy(c_Recv_Info->File_Type,"unknow");
}
//printf("\n\n------%s-----\n\n",c_Recv_Info->File_Type);
//exit(0);
return 1;
}

unsigned long get_file(char *c_File_Name,char *c_Buf)//取 html 文件内容
{
FILE *fp;
int i=0;

if((fp=fopen(c_File_Name,"rb"))==NULL)//如过打开文件失败
{
strcpy(c_Buf,"404 error, file not find!");
return strlen(c_Buf);
}

while(!feof(fp))
{
*c_Buf++=getc(fp);
i++;
}
*--c_Buf='\0';
i--;

fclose(fp);

return i;
}
阅读(311) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~