如何发送POST请求和接收GET响应
How to send POST Request and receive GET response
我正在尝试发送POST请求并接收GET响应。
下面是我的代码:#define IP "87.98.245.77"
#define Port 80
void getGETMessage(SOCKET s)
{
char *data = new char[2000];
recv(s, data, strlen(data), NULL);
int x = 3;
}
void SendPOSTMessage(SOCKET s)
{
string data = "POST /index.php?p=convert HTTP/1.1"
"Host: convert2mp3.netConnection: keep-alive"
"Content-Length: 80";
"Cache-Control: max-age=0"
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
"Origin: http://convert2mp3.net"
"User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36"
"Content-Type: application/x-www-form-urlencoded"
"Referer: http://convert2mp3.net/index.php?p=home"
"Accept-Encoding: gzip,deflate,sdch"
"Accept-Language: he-IL,he;q=0.8,en-US;q=0.6,en;q=0.4,de;q=0.2,fr;q=0.2";
if (send(s, data.c_str(), data.length(), NULL) < data.length())
{
cout << "Error : " << WSAGetLastError() << endl;
return ;
}
getGETMessage(s);
}
int main()
{
char *data = new char[200];
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
SOCKET ConnectSocket;
ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
sockaddr_in clientService;
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr(IP); // IP
clientService.sin_port = htons(Port); // Port
iResult = connect(ConnectSocket, (SOCKADDR *)& clientService, sizeof(clientService));
if (iResult == SOCKET_ERROR)
{
cout << "Error" << endl;
return 0;
}
SendPOSTMessage(ConnectSocket);
cin.get();
cin.get();
}
由于某种原因,我没有得到任何回报…我试着获取这个网站的IP:http://convert2mp3.net/index.php?p=home
和使用cmd,它告诉我它是http://87.98.245.77/
,但它没有加载在我的浏览器…也许这是我的错误?
谢谢!
您的数据无效。每个HTTP报头需要以rn结束,并且在最后一行报头之后需要另一个报头。而你发送的content -length是80,但是没有内容
进一步指出:如果send()返回一个正整数,调用WSAGetLastError()是没有意义的。没有错误,所以你得到的是undefined。你应该检查是否为-1。在实践中,send()不会返回一个短计数,除非你是在非阻塞模式下。
NULL不是send()或recv()的第四个参数,但0是正确的。
没有所谓的"GET响应"。只有HTTP响应
问题(至少一个)在这部分代码中:
void getGETMessage(SOCKET s)
{
char *data = new char[2000];
recv(s, data, strlen(data), NULL);
int x = 3;
}
你没有初始化数据,所以,可能有任何符号,所以strlen(data)可能返回0,如果第一个符号将是' ',或其他,取决于' '何时出现。尝试将strlen更改为sizeof.
像这样:
void getGETMessage(SOCKET s)
{
char data[2000] = {0};
recv(s, data, sizeof(data)-1, NULL);
cout << data << endl;
int x = 3;
}
根据您的代码,您只发送标题信息。指定Content-Length为80,但不发送任何数据。因此,服务器仍然在等待数据,并且还没有向您发送响应。
我的建议是利用一些HTTP库,而不是尝试自己执行所有的底层功能。
相关文章:
- Cpp-Tuple使用带有变量的get
- 当服务中的事件被触发时,如何将响应从服务发送回客户端?
- 通过 get-Method 访问变量在类外不起作用
- 为什么无论你输入什么,这"while(cin.get(str,3))"只运行一次?
- Boost.Asio/OpenSSL HTTPS GET certificate trouble
- C++中是否有任何函数等同于python中字典的get函数?
- C++ 信号和插槽不工作:插槽不响应事件
- NodeJs 服务器充斥着 UDP 广播,不发送响应
- C++关于ENUM的问题。我得到的响应比枚举列表大
- 使用istringstearm和get行缓慢读取文件
- 如何将 c++ get 函数代码转换为 opencv 算法中使用的 python
- 应用程序在打开的简历中捕获视频后没有响应
- 使用 cpprest (Casablanca) 返回 PDF 响应
- 使用 cin.get() 初始化字符数组
- Qt中HTTP GET响应上的奇怪编码
- 推迟 HTTP GET 响应,直到用户更改数据库中的值
- GET请求后服务器的响应不正确
- 错误:403响应Boost HTTPS GET请求
- 如何发送POST请求和接收GET响应
- 如何在本地c++ linux中响应http get