Linux 网络编程初探,TCP发送http请求到service 80端口小示例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <unistd.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

extern int h_errno;

// use curl www.baidu.com, dump the pcap packet, the request content as flows:
static char REQUEST_LIEN_AND_HEADERS[1024] = "GET / HTTP/1.1\r\nHost: www.baidu.com\r\n"
    "User-Agent: curl/7.58.0\r\nAccept: */*\r\n\r\n";

int main(int argc, char* argv[])
{
    char host[] = "www.baidu.com";
    printf("host: %s\n", host);
    // get ip addr by domain.
    struct hostent * h = gethostbyname(host);
    if (h == NULL)
    {
        perror("gethostbyname");
        return 0;
    }
    
    printf("h_name:%s, type:%s\n", h->h_name, h->h_addrtype == AF_INET ? "AF_INET" : "AF_INET6");
    int i = 0;
    // string format ip like "192.168.1.2"
    char str[31] = {};
    int flag = 0;
    for (i = 0; ; i++)
    {
        if (h->h_addr_list[i] != NULL)
        {
            flag = 1;
            printf("IP: %s\n", inet_ntop(h->h_addrtype, h->h_addr_list[i],str, 30));
            printf("str: %s\n", str);
        }
        else
        {
            break;
        }
    }
    for (i = 0; ;i++)
    {
        if (h->h_aliases[i] != NULL)
        {
            printf("alias %d:%s\n", i, h->h_aliases[i]);
        }
        else
        {
            break;
        }
    }
    if (flag == 0)
    {
        return 0;
    }
    // IPv6 不考虑,直接返回
    if (h->h_addrtype != AF_INET)
    {
        return 0;
    }
    // 可能获取失败,那么直接返回
    if (h->h_addr_list == NULL)
    {
        return 0;
    }
    char ip_str[32] = {};
    // use first ip 
    inet_ntop(h->h_addrtype, h->h_addr_list[0], ip_str, 30);
    int sockfd = socket(h->h_addrtype, SOCK_STREAM, 0);
    struct sockaddr_in addr = {};
    addr.sin_family = h->h_addrtype;
    addr.sin_port = htons(80);
    // inet_pton: 兼容式 IPv4、IPv6 的地址格式转换方式
    inet_pton(h->h_addrtype, ip_str, &addr.sin_addr.s_addr);
    //addr.sin_addr.s_addr = inet_addr(ip_str);

    int ret = connect(sockfd, (struct sockaddr*)&addr, sizeof(addr));
    write(sockfd, REQUEST_LIEN_AND_HEADERS, strlen(REQUEST_LIEN_AND_HEADERS));
    
    char bf[1024*4];
    ret = read(sockfd, bf, sizeof(bf)-1);
    if (ret == 0)
    {
        close(sockfd);
        return 0;
    }
    if (ret >= 1024 * 4)
    {
        // 4K memory to hold the response, if reponse's size > 4k, truncated.
        bf[1024 * 4 - 1] = 0;
    }
    else
    {
        bf[ret] = 0;
    }
    
    printf("\n============================================\n");

    printf("%s\n", bf);
    close(sockfd);

    return 0;
}


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值