C++笔记

每次写C++的时候都会忘记好多以前写过的东西,所以现在把自己的问题记下来,以后方便查
环境是ubuntu 16.04

socket

  • http请求

目前做的是用socket实现http get请求,客户端和服务器的之后用到了再补上

#include <stdio.h>
#include <stdlib.h>
#include <string>    //strlen
#include <sys/socket.h>
#include <arpa/inet.h> //inet_addr
#include <netdb.h>
#include <errno.h>
#include <iostream>
#include <cstring>

int main(int argc, char *argv[])
{
   
    int socket_desc;
    struct sockaddr_in server;
    char *message;

    //Create socket
    socket_desc = socket(AF_INET, SOCK_STREAM , 0);
    if (socket_desc == -1) {
   
        printf("Could not create socket");
    }

    char ip[20] = {
   0};
    char *hostname = (char*)"xxx.com"; //你的域名
    struct hostent *hp;
    if ((hp = gethostbyname(hostname)) == NULL) {
   
        printf("error\n");
        return 1;
    }

    strcpy(ip, inet_ntoa(*(struct in_addr *)hp->h_addr_list[0]));

    server.sin_addr.s_addr = inet_addr(ip);
    server.sin_family = AF_INET;
    server.sin_port = htons(80);  //一般都是80端口


    //Connect to remote server
    if (connect(socket_desc, (struct sockaddr *)&server, sizeof(server)) < 0) {
   
        printf("connect error");
        return 1;
    }

    cout << "Connected" <<endl;

    //Send some data
    //http 协议
    message = (char*)"GET / HTTP/1.1\r\nHost: xxx.com\r\nConnection:close\r\n\r\n";  //这里如果不知道写什么可以用wireshark抓包看一下

    //向服务器发送数据
    if (send(socket_desc, message, strlen(message) , 0) < 0) {
   
        cout << "Send failed"<< endl;
        return 1;
    }
    cout << "Data Send" << endl;

    struct timeval timeout = {
   3, 0};
    setsockopt(socket_desc, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(struct timeval));

    //Receive a reply from the server
    //loop
    int size_recv, total_size = 0;
    int chunkSize = 512;
    char chunk[chunkSize];

    while(1) {
   
        memset(chunk , 0 , chunkSize); //clear the variable
        //获取数据
        if ((size_recv =  recv(socket_desc, chunk, chunkSize, 0) ) == -1) {
   
            if (errno == EWOULDBLOCK || errno == EAGAIN) {
   
                printf(&#
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值