第一行称为请求行,GET是请求方法,表示获取资源,除此之外还有POST方法、PUT方法、HEAD方法、DELETE方法和OPTIONS方法等。由于我们写一个简单的服务器,所以暂时仅支
持GET方法。/是URI,表示客户希望访问的资源的URI。HTTP/1.1是HTTP协议的版本,此例中表示1.1版本。我们需要解析请求行,需要解析出方法字段、URI和HTTP协议版本。
第二行是Host字段,表示所请求的资源所在的主机名和端口号。
第三行User-Agent是客户的浏览器的类型,此例是运行在Ubuntu上的Firefox浏览器。
第四行Accept表示客户接受的资源的类型。
第四行Accept-Language表示客户接受的语言类型。
第五行Connection表示服务器在发送完客户请求的数据之后是否断开TCP连接。keep-alive表示不断开,close表示断开。
去看一下《Advanced Linux Programming》这本书吧,第11章讲的就是怎么用C语言实现一Http服务器。 这里有下载地址(英文的): http://www.advancedlinuxprogramming.com/alp-folder 英文看起来不顺的话可以上网找找有没有中文版的这本书,应该叫Linux高级编程吧~~~参考资料: http://www.advancedlinuxprogramming.com/alp-folderOK#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <unistd.h>
#include <string.h>
int main(int argc,char *argv[])
{
int sockfd,new_socket
int sock_value
char buf[] = "hello! China!I Love You\n"
struct sockaddr_in client_
struct sockaddr_in server_
int SIZE = sizeof(struct sockaddr_in)
if(argc != 2){
fprintf(stderr,"The two number!\n")
exit(1)
}
if((sock_value = atoi(argv[1])) <0){
fprintf(stderr,"socket error!\n")
exit(1)
}
if((sockfd = socket(PF_INET,SOCK_STREAM, 0)) == -1){
perror("socket")
exit(1)
}
bzero(&server_,SIZE)
server_.sin_family = PF_INET
server_.sin_port = htons(sock_value)
server_.sin_addr.s_addr = INADDR_ANY
if(bind(sockfd,(struct sockaddr *)(&server_),SIZE) == -1){
perror("bind")
exit(1)
}
if(listen(sockfd, 12) == -1){
perror("listen")
exit(1)
}
printf("Waiting ... ...\n")
while(1){
if((new_socket = accept(sockfd,(struct sockaddr *)(&client_),&SIZE)) == -1){
perror("accept")
exit(1)
}
printf("The client IP is %s\n",inet_ntoa(client_.sin_addr))
printf("The socket is %d\n",ntohs(client_.sin_port))
if(write(new_socket,buf,strlen(buf)) == -1){
perror("write")
exit(1)
}
int my
char mybuf[1024]
if((my = read(new_socket, mybuf,1024)) == -1){
perror("read")
exit(1)
}
mybuf[my] = '\0'
printf("#++++#++++#:%s\n",mybuf)
close(new_socket)
}
close(sockfd)
return 0
}
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
int sockfd
int sock_value
char buf[1024]
char mybuf[] = "Linux\n"
int read_count
struct sockaddr_in client_
struct sockaddr_in server_
int SIZE = sizeof(struct sockaddr_in)
if(argc != 3){
fprintf(stderr,"The two number!\n")
exit(1)
}
if((sock_value = atoi(argv[2])) <0){
fprintf(stderr,"socket error!\n")
exit(1)
}
if((sockfd = socket(PF_INET,SOCK_STREAM, 0)) == -1){
perror("socket")
exit(1)
}
bzero(&client_,SIZE)
bzero(&server_,SIZE)
client_.sin_family = PF_INET
client_.sin_port = htons(52252)
client_.sin_addr.s_addr = INADDR_ANY
server_.sin_family = PF_INET
server_.sin_port = htons(sock_value)
server_.sin_addr.s_addr = inet_addr(argv[1])
if(connect(sockfd,(struct sockaddr *)(&server_),SIZE) == -1){
perror("connect")
exit(1)
}
if((read_count = read(sockfd,buf,1024)) == -1){
perror("read")
exit(1)
}
buf[read_count] = '\0'
printf("#----#----#:%s\n",buf)
if(write(sockfd, mybuf,6) == -1){
perror("write")
exit(1)
}
close(sockfd)
exit(0)
return 0
}
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)