socket http通信

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;
}


                                                                            

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值