C++ 用socket封装成http

2023-05-16

// HttpSocket.h: interface for the CHttpSocket class.
//
//

#if !defined(AFX_HTTPSOCKET_H__F49A8F82_A933_41A8_AF47_68FBCAC4ADA6__INCLUDED_)
#define AFX_HTTPSOCKET_H__F49A8F82_A933_41A8_AF47_68FBCAC4ADA6__INCLUDED_

#include
<afxinet.h>

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CHttpSocket 
{
public:
    CHttpSocket();
   
virtual ~CHttpSocket();
   
int    GetServerState();//返回服务器状态码 -1表示不成功
    int    GetField(const char* szSession,char *szValue,int nMaxLength);//返回某个域值,-1表示不成功
    int    GetResponseLine(char *pLine,int nMaxLength);//获取返回头的一行
    const char*    GetResponseHeader(int &Length);//获取完整的返回头
    const char *FormatRequestHeader(char *pServer,char *pObject,long &Length,
                       
char* pCookie=NULL,char *pReferer=NULL,
                       
long nFrom=0,long nTo=0,
                       
int nServerType=0);//格式化请求头
    int    GetRequestHeader(char *pHeader,int nMaxLength) const;
    BOOL SendRequest(
const char* pRequestHeader = NULL,long Length = 0);   
    BOOL SetTimeout(
int nTime,int nType=0);
   
long Receive(char* pBuffer,long nMaxLength);
    BOOL Connect(
char* szHostName,int nPort=80);
    BOOL Socket();
    BOOL CloseSocket();
protected:   
   
char m_requestheader[1024];        //请求头
    char m_ResponseHeader[1024];    //回应头
    int m_port;                        //端口
    char m_ipaddr[256];                //IP地址
    BOOL m_bConnected;
    SOCKET m_s;
    hostent
*m_phostent;

   
int m_nCurIndex;                //GetResponsLine()函数的游标记录
    BOOL m_bResponsed;                //是否已经取得了返回头
    int m_nResponseHeaderSize;        //回应头的大小
};

#endif // !defined(AFX_HTTPSOCKET_H__F49A8F82_A933_41A8_AF47_68FBCAC4ADA6__INCLUDED_)

 

// HttpSocket.cpp: implementation of the CHttpSocket class.
//
//

#include
"stdafx.h"
#include
"HttpSocket.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

#define MAXHEADERSIZE 1024
//
// Construction/Destruction
//
CHttpSocket::CHttpSocket()
{
    m_s
=NULL;
    m_phostent
=NULL;
    m_port
=80;
    m_bConnected
=FALSE;
   
for(int i=0;i<256;i++)
        m_ipaddr[i]
='/0';
    memset(m_requestheader,
0,MAXHEADERSIZE);
    memset(m_ResponseHeader,
0,MAXHEADERSIZE);
    m_nCurIndex
= 0;        //
    m_bResponsed = FALSE;
    m_nResponseHeaderSize
= -1;
}

CHttpSocket::
~CHttpSocket()
{
    CloseSocket();
}

BOOL CHttpSocket::Socket()
{
   
if(m_bConnected)return FALSE;

   
struct protoent *ppe;
    ppe
=getprotobyname("tcp");
   
   
///创建SOCKET对象
    m_s=socket(PF_INET,SOCK_STREAM,ppe->p_proto);
   
if(m_s==INVALID_SOCKET)
    {
        TRACE(
"socket()函数执行失败!/n");
       
return FALSE;
    }

   
return TRUE;

}

BOOL CHttpSocket::Connect(
char *szHostName,int nPort)
{
   
if(szHostName==NULL)
       
return FALSE;

   
///若已经连接,则先关闭
    if(m_bConnected)
    {
        CloseSocket();
    }

   
///保存端口号
    m_port=nPort;

   
///根据主机名获得IP地址
    m_phostent=gethostbyname(szHostName);
   
if(m_phostent==NULL)
    {
        TRACE(
"gethostbyname()函数执行失败!/n");
       
return FALSE;
    }   
   
///连接
    struct in_addr ip_addr;
    memcpy(
&ip_addr,m_phostent->h_addr_list[0],4);///h_addr_list[0]里4个字节,每个字节8位

   
struct sockaddr_in destaddr;
    memset((
void *)&destaddr,0,sizeof(destaddr));
    destaddr.sin_family
=AF_INET;
    destaddr.sin_port
=htons(80);
    destaddr.sin_addr
=ip_addr;

   
///保存主机的IP地址字符串
    sprintf(m_ipaddr,"%d.%d.%d.%d",
        destaddr.sin_addr.S_un.S_un_b.s_b1,
        destaddr.sin_addr.S_un.S_un_b.s_b2,
        destaddr.sin_addr.S_un.S_un_b.s_b3,
        destaddr.sin_addr.S_un.S_un_b.s_b4);

   
if(connect(m_s,(struct sockaddr*)&destaddr,sizeof(destaddr))!=0)
    {
   
//    TRACE(NULL,"connect()函数执行失败!","错误",MB_OK);
        return FALSE;
    }
   
///设置已经连接的标志
    m_bConnected=TRUE;
   
return TRUE;
}

///根据请求的相对URL输出HTTP请求头
const char *CHttpSocket::FormatRequestHeader(char *pServer,char *pObject, long &Length,
                                     
char *pCookie,char *pReferer,long nFrom,
                                     
long nTo,int nServerType)
{
   
char szPort[10];
   
char szTemp[20];
    sprintf(szPort,
"%d",m_port);
    memset(m_requestheader,
'/0',1024);

   
///第1行:方法,请求的路径,版本
    strcat(m_requestheader,"GET ");
    strcat(m_requestheader,pObject);
    strcat(m_requestheader,
" HTTP/1.1");
    strcat(m_requestheader,
"/r/n");

   
///第2行:主机
    strcat(m_requestheader,"Host:");
    strcat(m_requestheader,pServer);
    strcat(m_requestheader,
"/r/n");

   
///第3行:
    if(pReferer != NULL)
    {
        strcat(m_requestheader,
"Referer:");
        strcat(m_requestheader,pReferer);
        strcat(m_requestheader,
"/r/n");       
    }

   
///第4行:接收的数据类型
    strcat(m_requestheader,"Accept:*/*");
    strcat(m_requestheader,
"/r/n");

   
///第5行:浏览器类型
    strcat(m_requestheader,"User-Agent:Mozilla/4.0 (compatible; MSIE 5.00; Windows 98)");
    strcat(m_requestheader,
"/r/n");

   
///第6行:连接设置,保持
    strcat(m_requestheader,"Connection:Keep-Alive");
    strcat(m_requestheader,
"/r/n");

   
///第7行:Cookie.
    if(pCookie != NULL)
    {
        strcat(m_requestheader,
"Set Cookie:0");
        strcat(m_requestheader,pCookie);
        strcat(m_requestheader,
"/r/n");
    }

   
///第8行:请求的数据起始字节位置(断点续传的关键)
    if(nFrom > 0)
    {
        strcat(m_requestheader,
"Range: bytes=");
        _ltoa(nFrom,szTemp,
10);
        strcat(m_requestheader,szTemp);
        strcat(m_requestheader,
"-");
       
if(nTo > nFrom)
        {
            _ltoa(nTo,szTemp,
10);
            strcat(m_requestheader,szTemp);
        }
        strcat(m_requestheader,
"/r/n");
    }
   
   
///最后一行:空行
    strcat(m_requestheader,"/r/n");

   
///返回结果
    Length=strlen(m_requestheader);
   
return m_requestheader;
}

///发送请求头
BOOL CHttpSocket::SendRequest(const char *pRequestHeader, long Length)
{
   
if(!m_bConnected)return FALSE;

   
if(pRequestHeader==NULL)
        pRequestHeader
=m_requestheader;
   
if(Length==0)
        Length
=strlen(m_requestheader);

   
if(send(m_s,pRequestHeader,Length,0)==SOCKET_ERROR)
    {
        TRACE(
"send()函数执行失败!/n");
       
return FALSE;
    }
   
int nLength;
    GetResponseHeader(nLength);
   
return TRUE;
}

long CHttpSocket::Receive(char* pBuffer,long nMaxLength)
{
   
if(!m_bConnected)return NULL;

   
///接收数据
    long nLength;
    nLength
=recv(m_s,pBuffer,nMaxLength,0);
   
   
if(nLength <= 0)
    {
       
//MessageBox(NULL,"recv()函数执行失败!","错误",MB_OK);
        CloseSocket();
    }
   
return nLength;
}

///关闭套接字
BOOL CHttpSocket::CloseSocket()
{
   
if(m_s != NULL)
    {
       
if(closesocket(m_s)==SOCKET_ERROR)
        {
            TRACE(
"closesocket()函数执行失败!/n");
           
return FALSE;
        }
    }
    m_s
= NULL;
    m_bConnected
=FALSE;
   
return TRUE;
}

int CHttpSocket::GetRequestHeader(char *pHeader, int nMaxLength) const
{
   
int nLength;
   
if(int(strlen(m_requestheader))>nMaxLength)
    {
        nLength
=nMaxLength;
    }
   
else
    {
        nLength
=strlen(m_requestheader);
    }
    memcpy(pHeader,m_requestheader,nLength);
   
return nLength;
}

//设置接收或者发送的最长时间
BOOL CHttpSocket::SetTimeout(int nTime, int nType)
{
   
if(nType == 0)
    {
        nType
= SO_RCVTIMEO;
    }
   
else
    {
        nType
= SO_SNDTIMEO;
    }

    DWORD dwErr;
    dwErr
=setsockopt(m_s,SOL_SOCKET,nType,(char*)&nTime,sizeof(nTime));
   
if(dwErr)
    {
        TRACE(
"setsockopt()函数执行失败!/n");
       
return FALSE;
    }
   
return TRUE;
}

//获取HTTP请求的返回头
const char* CHttpSocket::GetResponseHeader(int &nLength)
{
   
if(!m_bResponsed)
    {
       
char c = 0;
       
int nIndex = 0;
        BOOL bEndResponse
= FALSE;
       
while(!bEndResponse && nIndex < MAXHEADERSIZE)
        {
            recv(m_s,
&c,1,0);
            m_ResponseHeader[nIndex
++] = c;
           
if(nIndex >= 4)
            {
               
if(m_ResponseHeader[nIndex - 4] == '/r' && m_ResponseHeader[nIndex - 3] == '/n'
                   
&& m_ResponseHeader[nIndex - 2] == '/r' && m_ResponseHeader[nIndex - 1] == '/n')
                bEndResponse
= TRUE;
            }
        }
        m_nResponseHeaderSize
= nIndex;
        m_bResponsed
= TRUE;
    }
   
    nLength
= m_nResponseHeaderSize;
   
return m_ResponseHeader;
}

//返回HTTP响应头中的一行.
int CHttpSocket::GetResponseLine(char *pLine, int nMaxLength)
{
   
if(m_nCurIndex >= m_nResponseHeaderSize)
    {
        m_nCurIndex
= 0;
       
return -1;
    }

   
int nIndex = 0;
   
char c = 0;
   
do
    {
        c
= m_ResponseHeader[m_nCurIndex++];
        pLine[nIndex
++] = c;
    }
while(c != '/n' && m_nCurIndex < m_nResponseHeaderSize && nIndex < nMaxLength);
   
   
return nIndex;
}

int CHttpSocket::GetField(const char *szSession, char *szValue, int nMaxLength)
{
   
//取得某个域值
    if(!m_bResponsed) return -1;
   
    CString strRespons;
    strRespons
= m_ResponseHeader;
   
int nPos = -1;
    nPos
= strRespons.Find(szSession,0);
   
if(nPos != -1)
    {
        nPos
+= strlen(szSession);
        nPos
+= 2;
       
int nCr = strRespons.Find("/r/n",nPos);
        CString strValue
= strRespons.Mid(nPos,nCr - nPos);
        strcpy(szValue,strValue);
       
return (nCr - nPos);
    }
   
else
    {
       
return -1;
    }
}

int CHttpSocket::GetServerState()
{
   
//若没有取得响应头,返回失败
    if(!m_bResponsed) return -1;
   
   
char szState[3];
    szState[
0] = m_ResponseHeader[9];
    szState[
1] = m_ResponseHeader[10];
    szState[
2] = m_ResponseHeader[11];

   
return atoi(szState);
}

//下载子线程
DWORD WINAPI DownLoadIIS(LPVOID lParam)
{
    DOWNLOADIIS_INFO
*pIIS = (DOWNLOADIIS_INFO *)lParam;

   
if(pIIS->pAttrib->bDownload || pIIS->pAttrib->sDownloadAddr =="")
    {
        delete pIIS;
       
return -1;
    }
   
   
char szPath[256] = "/0";
    GetCurrentDirectory(
256,szPath);
    strcat(szPath,
"//Archive//");
   
char strFilePath[256] = "/0";
    wsprintf(strFilePath,
"%s%d.rar",szPath,pIIS->nIndex);

    CHttpSocket HttpSocket;
    CString strServer,strObject;
    unsigned
short nPort;
    DWORD dwServiceType;
   
long nLength;
   
const char *pRequestHeader = NULL;
    AfxParseURL(pIIS
->pAttrib->sDownloadAddr,dwServiceType,strServer,strObject,nPort);
   
    pRequestHeader
= HttpSocket.FormatRequestHeader((LPTSTR)(LPCTSTR)strServer,(LPTSTR)(LPCTSTR)strObject,nLength);   
   
   
   
if(!HttpSocket.Socket())
    {
        TRACE(
"创建服务器连接出错!/n");
        delete pIIS;
       
return -1;
    }
   
    HttpSocket.SetTimeout(
16000,0);
   
   
if(!HttpSocket.Connect((LPTSTR)(LPCTSTR)strServer,nPort))
    {
        TRACE(
"连接服务器出错/n");
        delete pIIS;
       
return -1;
    }
   
   
if(!HttpSocket.SendRequest())
    {
        TRACE(
"发送请求出错/n");
        delete pIIS;
       
return -1;
    }
   
   
   
int nLineSize = 0;
   
char szValue[30];
    HttpSocket.GetField(
"Content-Length",szValue,30);
   
int nSvrState = HttpSocket.GetServerState();
   
   
//服务器状态
    if(nSvrState == 404)
    {
        delete pIIS;
       
return -1;
    }
   
   
int nFileSize = atoi(szValue);//URL文件的长度
    int nCompletedSize = 0;
    CFile File;
    File.Open(strFilePath,CFile::modeCreate
| CFile::modeWrite);
   
char pData[1024];
   
int nReceSize = 0;
    DWORD dwStartTime,dwEndTime;
   
while(nCompletedSize < nFileSize)
    {
        dwStartTime
= GetTickCount();
        nReceSize
= HttpSocket.Receive(pData,1024);
       
if(nReceSize == 0)
        {
            TRACE(
"服务器已经关闭连接/n");
            delete pIIS;
           
return -1;
        }
       
if(nReceSize == -1)
        {
            TRACE(
"接收数据超时./n");
            delete pIIS;
           
return -1;
        }
        dwEndTime
= GetTickCount();
        File.Write(pData,nReceSize);
        nCompletedSize
+= nReceSize;
    }
    File.Close();


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 用socket封装成http 的相关文章

  • Android开发又将带来新一轮热潮,很多开发者都投入到这个浪潮中去了,创造了许许多多相当优秀的...

    Android开发又将带来新一轮热潮 xff0c 很多开发者都投入到这个浪潮中去了 xff0c 创造了许许多多相当优秀的 应用 其中也有许许多多的开发者提供了应用开源项 目 xff0c 贡献出他们的智慧和创造力 学习开源代码 是掌握技术的一
  • 关于Java加密扩展的出口限制

    近日 xff0c 在Matrix Security版上 http www matrix org cn thread shtml topicId 61 39543 amp forumId 61 55 提出一个问题 xff0c 即他的程序不能正
  • Win7 USB接口无法使用/驱动错误/该设备无法启动。(代码10) 故障解决方法

    电脑USB接口突然有一个不能用了 xff0c 开始以为是驱动问题 xff0c 可是用好几个驱动软件 xff08 驱动精灵 驱动人生等 xff09 更新驱动都无法解决 xff0c 后来发现在设备管理器里有一个设备驱动有问题 xff0c 尝试卸
  • Linux操作手册

    Linux操作手册 查看防火墙是否开启 systemctl status firewalld 开启防火墙 systemctl start firewalld 关闭防火墙 systemctl stop firewalld 查看所有开启的端口
  • 【转】实现电子词典要解决的技术问题及初步的解答

    转自 url http www blogjava net nokiaguy archive 2010 07 31 327623 html url quote 英文词典是手机中经常使用的应用 因此 xff0c 在本文将结合Android来讨论
  • 关于I2C和SPI总线协议

    关于I2C和SPI总线协议 IICvs SPI 现今 xff0c 在低端数字通信应用领域 xff0c 我们随处可见IIC Inter Integrated Circuit 和 SPI Serial Peripheral Interface
  • strchr()、strrchr()、strchrnul()函数

    原文链接 xff1a http blog sina com cn s blog 8b745a5f01017t8b html 头文件 xff1a include 函数原型 xff1a char strchr char str int c ch
  • 面向对象编程之分层思想

    分层 xff1a 就是为了忽略细节 xff0c 关注自己需要关注的地方 1 实体层 xff1a 分析模块所要设计的表 xff0c 确定表之间的关系 gt 编写hibernate Mapping 文件和持久化实体类 2 DAO层 xff1a
  • Linux_apt-get remove 与 apt-get autoremove、aptitude remove的不同

    apt get remove 与 apt get autoremove aptitude remove 的不同 apt get remove 的行为我们很好理解 xff0c 就是删除某个包的同时 xff0c 删除依赖于它的包 例如 xff1
  • 再见,2011

    2011 xff0c 又是匆匆的一年 悄然回首 xff0c 得到的 xff0c 失去的 xff0c 欢乐的 xff0c 酸楚的 xff0c 每天都在交错 即将过去的201一年注定不平凡的是一年 xff0c 是难忘的一年 xff0c 是蛋疼的
  • pptv web前端面试题答案

    这是星期一考完试 xff0c 答应星期三补上的 xff0c 代码很简单 xff0c 就不写注释了 php快排 function quickSort amp arr arr left 61 new array arr right 61 new
  • Android初级教程_在电脑上共享手机屏幕

    我们知道有的时候需要截取手机屏幕 可以通过豌豆荚 91助手等工具 第一这种方式在电脑上看到的手机屏幕比实际的要小 第二 需要安装此类软件 有时候该类软件和eclipse开发Android的时候可能冲突 连接不到adb 我们可以通过一下方式来
  • CMake 执行shell

    使用cmake时 xff0c 可以在cmakelist txt中如下执行shell 一 xff0c 方法1 set LOG 34 log txt 34 add custom command OUTPUT LOG COMMAND echo 3
  • 我对产品化的理解

    我对产品化的理解 产品化的时机是看业务的需要 xff0c 不管是对前景的落实 xff0c 还是项目转化成产品 xff0c 这些都不是技术人员能考虑的 xff0c 业务的发展和策划 xff0c 如何进行市场细化等如果都由技术人员考虑 xff0
  • PostMan中文设置

    第一 xff0c 打开postman所在文件的位置 查看自己的版本号 第二 xff0c 打开下面的链接找到对应的版本号下载 页面链接 xff1a https gitee com hlmd PostmanCn releases 下载好后回到p
  • Ubuntu下构建PX4软件

    本搭建过程基于http dev px4 io starting building html xff0c 希望大家互相交流学习 原文 xff1a Building PX4 Software xff08 构建PX4软件 xff09 PX4 ca
  • 什么是scrum中的3355?

    3355表示的是3个核心角色 xff0c 3个工件 xff0c 5个关键事件以及5大价值观 3个工件 xff1a 产品Backlog Sprint Backlog 潜在可交付软件增量 3个核心角色 xff1a 产品负责人 xff08 PO
  • sockaddr_in , sockaddr , in_addr区别Socket编程函数集(非常有用)

    一 sockaddr和sockaddr in在字节长度上都为16个BYTE xff0c 可以进行转换 struct sockaddr unsigned short sa family 2 char sa data 14 14 上面是通用的s
  • Java多线程编程学习笔记之十二:生产者—消费者模型(含代码)

    转载请注明出处 xff1a http blog csdn net ns code article details 17249321 生产者消费者问题是线程模型中的经典问题 xff1a 生产者和消费者在同一时间段内共用同一存储空间 xff0c
  • 读《大数据时代》后的一些感想

    最近快速阅读了 大数据时代 后 写下自己的一些感想 xff0c 自己也稍微清楚大数据这个概念吧 xff01 随着2012年云技术的迅速发展 xff0c 大数据也紧跟其后出现了 xff0c 而且近期受到许多行业的关注 几乎稍微有在网上逛逛的都

随机推荐

  • 程序人生之一:一个四年 JAVA 程序员的工作经历

    程序人生之一 xff1a 一个四年 JAVA 程序员的工作经历 很感谢 CSDN 网友liudonglovehemin 的这篇帖子 xff0c 真实记录了一个 Java 程序员的 4 年来在北京工作 学习 生活的成长之路 此情此景 xff0
  • 一步一步写算法(之 算法总结)

    声明 xff1a 版权所有 xff0c 欢迎转载 xff0c 请勿用于商业用途 联系信箱 xff1a feixiaoxing 64 163 com 自10月初编写算法系列的博客以来 xff0c 陆陆续续以来写了几十篇 按照计划 xff0c
  • 我人生的转折点

    来到兄弟连 差不多快两周的时间了 xff0c 在这里的每一天每天都觉得非常的充实 xff0c 来到这里才知道什么才做学习 xff0c 什么才叫只要努力了用功了 xff0c 用心了 xff0c 就会有成果 就如第一次的测验 xff0c 每天都
  • Canal AdminGuide

    背景 先前开源了一个开源项目 xff1a 阿里巴巴开源项目 基于mysql数据库binlog的增量订阅 amp 消费 本文主要是介绍一下如何部署 amp 使用 环境要求 1 操作系统 a 纯java开发 xff0c windows linu
  • 【Android病毒分析报告】 - Usbcleaver

    本文章由Jack Jia编写 xff0c 转载请注明出处 文章链接 xff1a http blog csdn net jiazhijun article details 9179749 作者 xff1a Jack Jia 邮箱 xff1a
  • 【浅墨著作】《逐梦旅程:Windows游戏编程之从零开始》勘误&配套源代码下载...

    I 39 m back 恩 xff0c 几个月不见 xff0c 大家还好吗 xff1f 这段时间真的好多童鞋在博客里留言说或者发邮件说浅墨你回来继续更新博客吧 woxiangnifrr童鞋说每天都在来浅墨的博客逛一下看有没有更新 xff0c
  • Anychart图表系列九之Dashboard

    Dashboard中文释义为仪表盘 控制台 xff0c 这个用词很生动 xff0c 它指的是多个图组合在一起的效果 xff0c 就像模具工作中的操作台一样由多种图形仪器组成 在项目中 xff0c 特别是高管平台 xff0c 领导看重的是多套
  • 若依前后端分离版本启动教程

    第一步 xff1a 搜索若依官网 第二步 xff1a 选择前后端分离版本 第三步 复制链接 第四步 随便在自己的电脑找找一个文件夹 xff0c 执行git命令 xff08 git安装使用教程这里不做说明 xff09 回车 96 96 96
  • char指针与char数组的区别(非常详细!)

    首先看指针 char p 61 helloworld 在这里p 是一个变量 其类型为指针类型 并且指向一个字符串 字符串内容为 helloworld 如果要访问p 2 的话 就需要先从p 中取出地址 该地址为 helloworld 的首地址
  • 大学六年我读过的一些书

    明天就是2014年 xff0c 今晚是13年最后一天 xff0c 我想不少人会写一下自己13年的一些心得 xff0c 在上一篇日志中 xff0c 该总结的已经总结 xff0c 想了解更多的已经加我个人微信了 我在想 xff0c 大学其实很多
  • Ubuntu硬盘分区和分区文件类型及Linux分区基础知识

    Ubuntu硬盘分区的常用系统 xff0c 于是我学习研究了Ubuntu硬盘分区 xff0c 在这里对大家详细介绍下Ubuntu硬盘分区应用 xff0c 希望对大家有用Ubuntu硬盘分区包含了非常好的翻译和容易使用的架构 如果你准备在硬盘
  • 欢迎使用CSDN-markdown编辑器

    我和谁都不争 xff0c 和谁争 xff0c 我都不屑 xff1b 我爱大自然 xff0c 其次就是艺术 xff1b 我双手烤着生命之火取暖 xff0c 火萎了 xff0c 我也准备走了 本Markdown编辑器使用StackEdit修改而
  • 从高考到程序员--------你到底在追求着什么?------串烧似的文章

    随便写写 xff0c 万事开头难 xff0c 不知道应该怎么写出来 xff0c 因为只有自己经历的才能是最美好的回忆 xff0c 不知道这个编辑器写的效果如何 xff0c 凑合着看吧 xff0c 从高考到程序员征文看了几篇 xff0c 决定
  • AI以来----已不再是未来

    在过去的2016年 xff0c 可以说AI的核心发展一直围绕着开源和生态 国际巨头纷纷涉足深度学习平台 xff0c 让原本是高高在上的人工智能 xff0c 迅速落地细化到了行业的各个领域 随着AI技术正在为全球开发者所用 xff0c 极大的
  • 即兴嘻哈

    kao ha wowo 深夜不能寐 xff0c 那个翻来覆也不能把觉睡 一首即兴style说说ni为何半夜还不睡 xff0c 一线城市压力大来人总疲惫 xff0c 为了买房买车拼命都在向前奔 年轻人出来打拼为何这么累 xff0c 多少人为了
  • 裸辞3个月扛不住后,随便接了offer更惨!

    最近发现年底找工作的人不少 xff0c 部门里就2个hc xff0c 一周能收2000 43 简历 xff0c 这比例有点 过分 了 虽说大部分是年底先看看机会试试水 xff0c 准备年后冲击的 xff0c 但看简历里也有不少中间裸辞的 x
  • Docker常用命令-自用

    Docker常用命令 自用 1 镜像仓库 1 1 登陆 登出 登陆 默认Docker Hub docker login u span class token punctuation span username span class toke
  • 程序猿的浪漫之二进制表白篇

    那天情人节 xff0c 我给她发了一串数字 xff08 01001001 00100000 01101100 01101111 01110110 01100101 00100000 01111001 01101111 01110101 xf
  • Dockerfile使用教程

    第一 创建一个spring boot项目 第二 创建 xff1a Dockerfile文件 xff08 在项目根目录下 xff09 第三 复制粘贴 FROM java 8 设置基础镜像 FROM openjdk 8 jdk alpine 指
  • C++ 用socket封装成http

    HttpSocket h interface for the CHttpSocket class if defined AFX HTTPSOCKET H F49A8F82 A933 41A8 AF47 68FBCAC4ADA6 INCLUD