2019-05-08
关键字:HTTP 连接、C语言访问网络
如果您比较有耐心,建议从头至尾读完这篇文章。如果您只想快速应用 C 语言的 HTTP GET 连接功能,可以直接跳到文末拷贝源代码去使用。
1、HTTP 连接的流程
HTTP 连接都是建立在 TCP 连接之上的。这里我们不讨论 TCP 的三次握手四次挥手过程。我们只单纯地来分析下一个 HTTP 连接的过程应该是怎样的。
首先,我们需要创建一个 TCP 的 Socket 。后面我们的网络连接操作都是基于这个 Socket 来构建的。
其次,我们需要来组装一下 HTTP 请求。就是封装一个 GET 请求,表明一下我们想要连接哪个服务器的哪些资源。当然,其实第 1 步和第 2 步的顺序并不重要。
第三步,我们需要发送 HTTP GET 请求了,将前面封装好的请求信息通过前面创建好的 TCP 通道发送出去。
第四步,读取服务端的返回结果。
2、代码实操
1、创建 Socket
int sockfd; //创建套接字 if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) { printf("socket failed!!!\n"); exit(0); }
没什么好说的,照着做就好了。
2、封装 HTTP 请求
char request[512] = { 0}; memset(request, 0, 512); strcat(request, "GET "); strcat(request, "/index.html"); strcat(request, " HTTP/1.1\n"); strcat(request, "Host: "); strcat(request, "192.168.221.30"); strcat(request, "\nContent-Type: text/html\n"); strcat(request, "Content-Length: 0\n"); strcat(request, "\r\n");
上面加粗标灰底的部分分别是要访问的资源路径以及服务器地址。其中服务器地址并不是很重要,但是上面的资源路径一定不能错!
3、发起 HTTP 请求
struct sockaddr_in servaddr; int writeRet; bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(80); if (inet_pton(AF_INET, "192.168.221.30", &servaddr.sin_addr) <= 0 ){ printf("inet_pton error!\n