#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define LINE_LEN 25
//配置文件存储结构
struct httppd{
char Port[10];
char Directory[20];
int listenfd;//服务器socket文件监听句柄
};
//客户端请求信息结构体
struct clientInfo{
struct sockaddr_in cliaddr;
int clifd;
};
//读取配置文件,暂时只是一个服务目录跟端口
void readDir (struct httppd *conf)
{
int fd;
FILE *file = fopen("/etc/myhttp.conf","r");
if(file == NULL)
{
perror("fopen error.");
exit(1);
}
bzero(conf,sizeof(struct httppd));
fscanf(file,"%s",conf->Port);
fscanf(file,"%s",conf->Directory);
strcpy(conf->Port,strchr(conf->Port,'=')+1);
strcpy(conf->Directory,strchr(conf->Directory,'=')+1);
fclose(file);
}
void *handlClient(void *connfd);
void sendMsg(void *cinfo);
//启动服务器
void startServer(struct httppd *conf)
{
struct sockaddr_in servaddr,cliaddr;
int listenfd,connfd;
//建入socket文件句柄
listenfd = socket(AF_INET,SOCK_STREAM,0);
conf->listenfd = listenfd;
//初始化服务器信息
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(atoi(conf->Port));
if(bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) == -1)
{
perror("bind error");
exit(0);
}
listen(listenfd,20);
printf("Accepting connections.......\n");
socklen_t cliaddr_len;
while(1)
{
cliaddr_len = sizeof(cliaddr);
connfd = accept(listenfd,(struct sockaddr *)&cliaddr,&cliaddr_len);
struct clientInfo cinfo;
cinfo.cliaddr = cliaddr;
cinfo.clifd = connfd;
//使用多线路程服务客户端请求,有待完善
pthread_t client;
pthread_create(&client,NULL,handlClient,&cinfo);
pthread_join(client,NULL);
close(connfd);
}
}
#define MAXLINE 80
//处理客户端请求
void *handlClient(void *info)
{
struct clientInfo cinfo = *(struct clientInfo *)info;
char buf[MAXLINE],n;
n = read(cinfo.clifd,buf,MAXLINE);
if(n < 0)
{
perror("read error....");
exit(0);
}
printf("Recvfrom information is %s\n",buf);
sendMsg(&cinfo);
}
//响应客户端请求
void sendMsg(void *info)
{
struct clientInfo cinfo = *(struct clientInfo *)info;
FILE *file = fopen("/var/www/index.html","r");
char buf[1024];
fread(buf,1024,1,file);
//fgets(buf,1024,file);
//printf("index.html %s\n",buf);
sendto(cinfo.clifd,buf,1024,0,(struct sockaddr *)&(cinfo.cliaddr),sizeof(cinfo.cliaddr));
fclose(file);
}
//程序入口
int main(int argc,char *argv[])
{
struct httppd conf;
readDir(&conf);
startServer(&conf);
close(conf.listenfd);
return 0;
}
只是一个练手程序,做个纪念,有待更多的学习与完善。
分享到:
相关推荐
Tcp服务端与客户端的JAVA实例源代码 2个目标文件 摘要:Java源码,文件操作,TCP,服务器 Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...
Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...
Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...
Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...
Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...
Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...
Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...
Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...
Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...
Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...
Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...
Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...
Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...
在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。...
在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。...
我一直使自己在很大程度上保持着一个Tcl程序员的角色,而我们工作组中的其他人员则埋头于Tcl本身的C语言实现。我创建的应用程序有HTML编辑器、EMAIL比用户接口程序、Web服务器以及用户数据库,我们的商务应用就建立...