客户与服务器之间的简单访问
通过浏览器(客户端)的搜索响应的文件,建立客户端与服务器之间的联系。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>
#define PORT 50000
#define IP "127.0.0.1"
int main()
{
//create docket descriptor
int c_sockfd;
int s_sockfd = socket(AF_INET,SOCK_STREAM,0);//
if(s_sockfd == -1)
{
perror("socket error!\n");
exit(1);
}
printf("socket create sccessful!\n");
//bind ip and port
struct sockaddr_in addr,c_addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = inet_addr(IP);
socklen_t addrlen = sizeof(struct sockaddr);
int opt = 1;
setsockopt(s_sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
if(bind(s_sockfd,(struct sockaddr*)(&addr),addrlen) == -1)
{
perror("bind error!\n");
exit(1);
}
printf("bind successful!\n");
// listen
if(listen(s_sockfd,10) == -1)
{
perror("listen error!\n");
exit(1);
}
//accept
char path[100];
//struct sockaddr_in c_addr ;
while(1)
{
c_sockfd = accept(s_sockfd,(struct sockaddr*)(&c_addr),&addrlen);
if(c_sockfd == -1)
{
perror("accept error!\n");
exit(1);
}
char buf[1024];
int len;
memset(buf,0,sizeof(buf));
read(c_sockfd,buf,sizeof(buf));
char filename[50];
char * s = buf;
char * d = filename;
while(*s++ != '/');
while(*s != ' ')
{
*d = *s;
d++;
s++;
}
*d = 0;
printf("filename:%s\n",filename);
//read file
memset(path,0,sizeof(path));
sprintf(path,"/home/ben/c.d/%s",filename);
int fd = open(path,O_RDONLY);
if(fd == -1)
{
//TODO 404
write(c_sockfd,"File Not Found!\n",16);
}
else
{
//TODO 200
write(c_sockfd,"HTTP/1.1 200 ok\n",16);//返回头的书写
write(c_sockfd,"Content-Language: zh-cn\n",24);
//extract suffix of filename
char suffix[10];
memset(suffix,0,sizeof(suffix));
s = filename;
d = suffix;
while(*s++ != '.');
while(*s)
{
*d = *s;
d++;
s++;
}
//printf("suffix:%s\n",suffix);
if(strcmp("html",suffix) == 0 || strcmp("htm",suffix) == 0 )
{
write(c_sockfd,"Content-Type: text/html; charset=UTF-8\n\n",40); //http content-Type文本的头的格式
else if(strcmp("jpg",suffix) == 0 || strcmp("jpeg",suffix) == 0
||strcmp("gif",suffix) == 0 || strcmp("png",suffix) == 0)
{
write(c_sockfd,"Content-Type: image/jpeg\n\n",26);
}
while(1)
{
memset(buf,0,sizeof(buf));
len = read(fd,buf,sizeof(buf));
write(c_sockfd,buf,len);
if(len < sizeof(buf))
{
break;
}
}
close(fd);
}
shutdown(c_sockfd,SHUT_RDWR);
}
close(s_sockfd);
close(c_sockfd);
return 0;
}