Linux下使用C語言socket發送HTTP請求

本文參考Stevens的APUE和UNP1

#include <netinet/in.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <sys/socket.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char **argv) {
	int sockfd;

	/* [struct sockaddr_in] included by <netinet/in.h> */
	struct sockaddr_in servaddr;

	if (argc != 2) {
		printf("usage: ./a.out <ip addr>\n");
		exit(-1);
	}
	
	/* [socket] included by <sys/socket.h> */
	if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
		/* [perror] included by <stdio.h> */
		perror("socket error");
		exit(-1);
	}

	/* [bzero] included by string.h */
	bzero(&servaddr, sizeof(servaddr));

	/* [htons] included by <arpa/inet.h> */
	servaddr.sin_port = htons(80);

	/* [AF_INET] included by <bits/socket.h>, but <sys/socket.h> inlude it */
	servaddr.sin_family = AF_INET;

	/* [inet_pton] included by <arpa/inet.h> */
	if ((inet_pton(AF_INET, argv[1], &servaddr.sin_addr)) < 0) {
		printf("inet_pton error\n");
		exit(-1);
	}

	/* [connect] included by <sys/socket.h> */
	if ((connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr))) < 0) {
		perror("connect error");
		exit(-1);
	}
	
	char recvline[65536];
	char buff[256] = "GET / HTTP/1.1\r\nHost: www.baidu.com\r\nConnection: close\r\n\r\n";

	/* [write] and [read] included by <unistd.h> */
	if ((write(sockfd, buff, strlen(buff))) < 0) {
		perror("write error");	
		exit(-1);
	}
	while (read(sockfd, recvline, sizeof(recvline))) {
		printf("%s", recvline);
	}
	printf("\n");

	exit(0);
}

使用方法:
clang demo.c /* demo.c 爲以上代碼 */
ping www.baidu.com得到百度的ip地址,本人得到ip地址爲: 61.135.169.125
./a.out 61.135.169.125

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章