c++ socket 模拟 http

本文介绍了一个使用Winsock库来实现HTTP GET请求的具体实例。该程序通过创建套接字并建立连接,发送HTTP GET请求到指定服务器,并接收服务器响应的数据。文章详细展示了如何初始化Winsock、创建和管理套接字、进行网络通信等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// GetURLContext.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include <winsock2.h>
#include <Ws2tcpip.h>
#include <windows.h>
#pragma comment(lib,"Ws2_32.lib")

#define DEFAULT_BUFLEN 1024
#define DEFAULT_PORT 80
#undef _UNICODE
int count = 0;
void myStrcat(char* _Destination,int start,char* _Source) {
    for (int i = 0; i < start; i++, count++) {
        _Destination[count] = _Source[i];
    }
}
int main()
{
    int iResult;
    WSADATA wsaData;

    SOCKET ConnectSocket = INVALID_SOCKET;
    struct sockaddr_in clientService;

    int recvbuflen = DEFAULT_BUFLEN;
    char *sendbuf = "GET / HTTP/1.1\r\n\r\n";
    char recvbuf[DEFAULT_BUFLEN] = "\0";
    char htmlContent[DEFAULT_BUFLEN * 16] = "\0";

    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);//初始化
    if (iResult != NO_ERROR) {
        wprintf(L"WSAStartup failed with error: %d\n", iResult);
        system("pause");
        return 1;
    }

    ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建socket
    if (ConnectSocket == INVALID_SOCKET) {
        wprintf(L"socket failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        system("pause");
        return 1;
    }

    clientService.sin_family = AF_INET;// IPv4 网络协议的套接字类型,AF_INET6 则是 IPv6 的
    clientService.sin_addr.s_addr = inet_addr("192.168.1.253");//baidu.com
    clientService.sin_port = htons(DEFAULT_PORT);

    iResult = connect(ConnectSocket, (SOCKADDR*)&clientService, sizeof(clientService));//连接
    if (iResult == SOCKET_ERROR) {
        wprintf(L"connect failed with error: %d\n", WSAGetLastError());
        closesocket(ConnectSocket);
        WSACleanup();
        system("pause");
        return 1;
    }

    iResult = send(ConnectSocket, sendbuf, (int)strlen(sendbuf), 0);//发送
    if (iResult == SOCKET_ERROR) {
        wprintf(L"send failed with error: %d\n", WSAGetLastError());
        closesocket(ConnectSocket);
        WSACleanup();
        system("pause");
        return 1;
    }
    printf("Bytes Sent: %d\n", iResult);

    iResult = shutdown(ConnectSocket, SD_SEND);//关闭连接
    if (iResult == SOCKET_ERROR) {
        wprintf(L"shutdown failed with error: %d\n", WSAGetLastError());
        closesocket(ConnectSocket);
        WSACleanup();
        system("pause");
        return 1;
    }

    // 等待数据直到对方关闭连接

    do {

        iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
        if (iResult > 0) {
            wprintf(L"Bytes received: %d\n", iResult);
            myStrcat(htmlContent, iResult, recvbuf);
        }
        else if (iResult == 0) {
            wprintf(L"Connection closed\n");
        }
        else {
            wprintf(L"recv failed with error: %d\n", WSAGetLastError());
        }
    } while (iResult > 0);


    // 关闭socket
    iResult = closesocket(ConnectSocket);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"close failed with error: %d\n", WSAGetLastError());
        WSACleanup();
        system("pause");
        return 1;
    }

    WSACleanup();

    wprintf(L"html:\n\n%S\n", htmlContent);
    system("pause");
    return 0;
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值