说明
通过上一篇博客, 我们基本了解了http服务器的工作流程,首先客户机和服务器建立TCP连接 ,连接建立以后,客户机发出http请求,服务器做出响应。所以我们第一步是通过socket编程编程来建立tcp连接,然后在发送http请求。我们先写http客户机,服务器就使用apache2 服务。
实验环境
两台 vmware ubuntu x64
服务端 192.168.93.143
客户机 192.168.93.144
建立tcp 连接
代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>
#include <netinet/in.h>
#define PORT 80
int main(int argc ,char * argv[])
{
struct sockaddr_in server;
int socket_fd;
struct in_addr ipadr;
ipadr.s_addr = inet_addr(argv[1]);
if(argc < 2){
printf("Usage <ip address>\n");
exit(-1);
}
if((socket_fd = socket(AF_INET,SOCK_STREAM,0))==-1)
{
printf("socket create error");
exit(-1);
}
bzero(&server,sizeof(server));
server.sin_family=AF_INET;
server.sin_port = htons(PORT);
server.sin_addr = ipadr;
if(connect(socket_fd,(struct sockaddr * )&server,sizeof(server))==-1){
printf("connect error");
exit(-1);
}
return 0;
}
发现建立了tcp连接,不过随后连接就断开,奇怪的是断开连接不是要四次握手吗?抓包发现只有三个包。有点神奇。好消息时连接建立了。
发送http请求
给apache 发送请求 。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>
#include <netinet/in.h>
#define MAXDATASIZE 10000
#define PORT 80
void process(FILE * fp , int sockfd);
int main(int argc ,char * argv[])
{
struct sockaddr_in server;
int socket_fd;
struct in_addr ipadr;
ipadr.s_addr = inet_addr(argv[1]);
if(argc < 2){
printf("Usage <ip address>\n");
exit(-1);
}
if((socket_fd = socket(AF_INET,SOCK_STREAM,0))==-1)
{
printf("socket create error");
exit(-1);
}
bzero(&server,sizeof(server));
server.sin_family=AF_INET;
server.sin_port = htons(PORT);
server.sin_addr = ipadr;
if(connect(socket_fd,(struct sockaddr * )&server,sizeof(server))==-1){
printf("connect error");
exit(-1);
}
process(stdin , socket_fd);
return 0;
}
void process(FILE * fp , int sockfd){
int num = 0;
char * sendline="GET / HTTP/1.1\r\n\
Host: 192.168.93.143\r\n\
Proxy-Connection: keep-alive\r\n\
Cache-Control: max-age=0\r\n\
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n\
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36\r\n\
Accept-Encoding: gzip,deflate,sdch\r\n\
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6\r\n\
\r\n";
printf("Connect to server");
send(sockfd,sendline,strlen(sendline),0);
char recvline[10000];
if((num = recv(sockfd,recvline ,MAXDATASIZE , 0))==0){
printf("Server terminated \n");
exit(-1);
}
recvline[num]='\0';
printf("server message:%s",recvline);
}
成功响应。