1.主要函数
--------struct hostent*gethostbyname(char *host); //用于主机解析,返回 struct hostent*指针
--------int socket(); //生成一个socket对象
--------int connect(); //连接server端
---------read()/write; //读写socket
2.http协议主要格式
strcat(message,"GET / HTTP/1.1\r\n");
strcat(message,"Accept: text/html\r\n");
strcat(message,"Host: www.baidu.com\r\n");
strcat(message,"User-Agent: Mozilla/5.0(compatible)\r\n");
strcat(message,"Connection: Keep-Alive\r\n");
strcat(message,"\r\n");
3.代码实现
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
void * msg_handler(void *serv_fd)
{
puts("aa*****");
char buf[100]={0};
while(read((int)serv_fd,buf,sizeof(buf)))
{
}
puts(buf);
return (void *)0;
}
int main()
{
int serv_fd;
char *hostname = "www.baidu.com";
char message[150]={0};
if((serv_fd=socket(AF_INET,SOCK_STREAM,0)) < 0)
{
perror("socket");
goto err_socket;
}
struct hostent *p = NULL;
p = gethostbyname(hostname);
if( p == NULL )
{
perror("error");
puts("error");
fflush(stdout);
}
puts("here");
if(*(p->h_addr_list) != NULL)
{
puts("*");
puts(inet_ntoa(*((struct in_addr *)(*(p->h_addr_list)))));
p->h_addr_list++;
}
struct sockaddr_in attr ={
.sin_family = AF_INET,
.sin_port = htons(80),
/* .sin_addr = {
.s_addr = *(p->h_addr),
*/
.sin_addr = *((struct in_addr*)(p->h_addr)),
};
strcat(message,"GET / HTTP/1.1\r\n");
strcat(message,"Accept: text/html\r\n");
strcat(message,"Host: www.baidu.com\r\n");
strcat(message,"User-Agent: Mozilla/5.0(compatible)\r\n");
strcat(message,"Connection: Keep-Alive\r\n");
strcat(message,"\r\n");
puts(message);
if(connect(serv_fd,(struct sockaddr*)&attr,sizeof(attr)) == -1)
{
perror("connect");
goto err_socket;
}
int i=0;
//while(1)
for(i=0;i<2;i++)
{
if((write(serv_fd,message,strlen(message))) < 0)
{
perror("write");
goto err_socket;
}
char buf[10000]={0};
int len =0;
if((len =read(serv_fd,buf,sizeof(buf))) < 0)
{
perror("read");
goto err_socket;
}
/ if(read())
printf("%d\n",len);
puts(buf);
puts(buf+400);
}
*
int ip = inet_addr("192.168.0.25");
attr.sin_addr.s_addr = *(p->h_addr);
puts(p->h_name);
puts((inet_ntoa(attr.sin_addr)));
/
/ if()
return 0;
err_socket:
return -1;
}