c++使用socket实现Post通信并获取返回信息
//post.h头文件 #pragma once #include #include #include using namespace std; class HttpRequest { // Http POST请求 std::string HttpPost(std::string url, std::string json, std::string methodName); private: std::string m_ip; int m_port; }; //用到的头文件 #include"stdafx.h" #include"pch.h" #include "post.h" #include #include #include #include using namespace std; #pragma comment(lib, "ws2_32.lib") // Http POST请求并发送json std::string HttpRequest::HttpPost(std::string url, std::string json, std::string methodName) { std::string ret; // 返回Http Response内容 try { // 开始进行socket初始化; WSADATA wData; ::WSAStartup(MAKEWORD(2, 0), &wData);//初始化socket环境 SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, 0);//初始化Socket实例 struct sockaddr_in ServerAddr = { 0 };//初始化sockaddr_in服务实例 ServerAddr.sin_addr.s_addr = inet_addr(m_ip.c_str());//设置sockaddr_in服务IP ServerAddr.sin_port = htons(m_port);//设置sockaddr_in服务端口 ServerAddr.sin_family = AF_INET;//设置sockaddr_in服务类型 int errNo = connect(clientSocket, (sockaddr*)&ServerAddr, sizeof(ServerAddr));//连接服务器 if (clientSocket == INVALID_SOCKET) { return ""; }//判断socket是否有效 DWORD TimeOut =500; //设置socket超时时长 if (::setsockopt(clientSocket, SOL_SOCKET, SO_SNDTIMEO, (char*)&TimeOut, sizeof(TimeOut)) == SOCKET_ERROR) { return ""; }//判断socket发送设置是否存在错误 TimeOut =500; if (::setsockopt(clientSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&TimeOut, sizeof(TimeOut)) == SOCKET_ERROR) { return ""; }//判断socket接收设置是否存在错误 if (errNo == 0)//判断socket连接服务器是否成功0为成功其他为失败 { std::string strLen = to_string(json.length() + 2);//获取json数据长度并添加2个回车换行符长度 std::string sendStr;//http发送报文 //进行发送报文拼接 sendStr += "POST "; sendStr += methodName; sendStr += " HTTP/1.1rn"; sendStr += "Connection: Keep-Alive rn"; sendStr += "Accept-Encoding:gzip, deflate rn"; sendStr += "Accept-Language:zh-CN,en,*rn"; sendStr += "Content-Length:"; sendStr += strLen; sendStr += "rn"; sendStr += "Content-Type:application/json;charset=UTF-8 rn"; sendStr += "Host:"; sendStr += m_ip; sendStr += ":"; sendStr += to_string(m_port); sendStr += "rn"; sendStr += "Origin:"; sendStr += url; sendStr += "rn"; sendStr += "rnrn"; sendStr += json; sendStr += "rnrn"; // 发送 errNo = send(clientSocket, sendStr.c_str(), (int)strlen(sendStr.c_str()), 0); //获取发送字节数 if (errNo > 0)//如果字节数大于0则表示发送成功 { cout<<"发送成功n"; } else { std::cout << "errNo:" << errNo << std::endl; ret = errNo; return ret; } // 接收 char bufRecv[1024];//设置接收char数组 bool isRun = true;//数据接收完毕标志 //循环接收数据 do { int r = recv(clientSocket, bufRecv, (1024), 0);//接收数据 if (r > 0)//判断接收到的数据长度是否为0 { ret.append(bufRecv); isRun = true; } else//如果接收长度为0则退出循环 { isRun = false; } } while (isRun); if(!(sizeof(ret)>0))//如果接收的数据长度不大于0则表示没有连接上服务器 { errNo = WSAGetLastError(); ret = "Err:Connect Fail ErrCode->"; ret += to_string(errNo); } } closesocket(clientSocket);//关闭socket WSACleanup(); // socket环境清理 } catch (...)//捕获异常 { return ""; } return ret; }
上一篇 C++文件操作fstream
下一篇 2048源代码
版权所有 (c)2021-2022 MSHXW.COM
ICP备案号:晋ICP备2021003244-6号