(GET HTTP请求)c++ sockets使用winsock.h
(GET HTTP Request) C++ sockets using winsock.h
好吧,在任何人急于得出结论之前(以及我与他人保持相关的事实),基本上,我想做一个使用Winsock.h.
在C/c++中使用套接字获取请求[ SocketRequest函数运行中存在的主要问题]
我一直得到错误响应代码从任何地方:"WSAENOTCONN 10057"到"WSAENOTSOCK 10038"我在这里找到了更多的信息:https://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx
以下是包含的文件:
#include "stdafx.h"
#include <time.h>
#include "Hooks.h"
#include <xhttp.h>
#include <winsockx.h>
#include <iostream>
#include <xtl.h>
#include <xbdm.h>
#include <malloc.h>
#include <stdio.h>
以下是定义和实例:
int Socket;
struct sockaddr_in SocketAddress;
char bufferReturn[10000];
char serverAddr[2000];
bool returnTEST = false;
char *Request1;
char *Request2;
char *ResetRequest;
//http://www.cplusplus.com/forum/general/9403/
//http://www.cplusplus.com/forum/beginner/139313/
#define SERVER_PORT htons(80)
下面是代码(包括失败的SocketRequest函数):
char* SocketRequest(char* URL, char* Path = "")
{
//THIS IS THE FUNCTION THAT CRASHES WHEN IT'S CALLED IDK WHY... NOTHING IN HERE RUNS, NOT EVEN THE "prinf" STATEMENT.
printf( "Step 0");
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf("WSA Startup FAILED! ", WSAGetLastError() );
}
printf( "Step 1");
SocketAddress.sin_addr.s_addr = htonl(INADDR_ANY);
printf( "Step 2");
SocketAddress.sin_family = AF_INET;
printf( "Step 3");
SocketAddress.sin_port = SERVER_PORT;
printf( "Step 4");
Socket = socket(AF_INET, SOCK_STREAM, 0);
printf( "Step 5");
// Make sure we have a valid socket
if( Socket == INVALID_SOCKET )
{
printf( "Attempted to send to an invalid socket.n" );
}
printf( "Step 6");
// If we're not broadcasting, make sure we have a peer to send to
if( SocketAddress.sin_addr.s_addr == INADDR_NONE )
{
printf( "Attempted to send a non-broadcast when we have no peer.n" );
}
printf( "Step 7");
if( bind( Socket, ( const sockaddr* )&SocketAddress, sizeof( SocketAddress ) ) != 0 )
{
printf( "Failed to bind socket, error %d.n", WSAGetLastError() );
}
printf( "Step 8");
strcpy(serverAddr, "GET /");
if (strlen(Path) > 0){
strcat(serverAddr, Path);
}
printf( "Step 9");
strcat(serverAddr, "");
strcat(serverAddr, " HTTP/1.0rnHOST: ");
strcat(serverAddr, URL);
strcat(serverAddr, "rnrn");
printf( "Step 10");
char buffer[10000];
int nDataLength;
while ((nDataLength = recv(Socket, buffer, 10000, 0)) > 0){
int i = 0;
while (buffer[i] >= 32 || buffer[i] == 'n' || buffer[i] == 'r') {
cout << buffer[i];
i += 1;
printf("While_Loop1_Fail");
}
printf("While_Loop2_Fail");
}
closesocket(Socket);
return 0;
WSACleanup();
}
void ResetArray(char *array_)
{
char *begin = bufferReturn;
char *end = begin + sizeof(array_);
std::fill(begin, end, 0);
}
bool IsRequest()
{
//HERES WHERE IT CRASHES, AS **SOON** as the "Request1 = SocketRequest" line is called.
printf("is_request...");
Request1 = SocketRequest("www.mywebsite.com", "test/test.php");
if (strstr(Request1, "ON"))
{
returnTEST = true;
ResetArray(bufferReturn);
return true;
}
else if (strstr(Request1, "OFF"))
{
returnTEST = false;
ResetArray(bufferReturn);
return true;
}
else if (strstr(Request1, "Null"))
{
printf(strstr(bufferReturn, "Nullnn"));
return false;
}
}
bool Reset()
{
ResetRequest = SocketRequest("www.mywebsite.com", "test/test.php");
printf(ResetRequest);
return true;
}
//This is where the code is ran from on the Console ON BOOT.
void mainThread(){
for(;;Sleep(45)){
if(bInitialized[0] == true || bInitialized[1] == true)
{
//THIS IS WHERE the function "IsRequest" is called.
printf("binit is true!");
if (IsRequest())
{
printf("Worked!n");
}
}
}
}
下面是运行时的输出:
binit is true! and still running...is_request...
------------------------------------------------------------------------
stop code: 0x2b (PANIC_STACK_SWITCH)
(0x3A097900,0x80072908,0x3A14E110,0x80076D88)
------------------------------------------------------------------------
Call Stack:
0x80072908 (EADDR)
0x80076D88 (LR)
0x91F96F3C
0x91F86B64
0x91F75520
0x91F5E92C
0x91F5EC68
0x91F5EECC
0x91F682E8
stop code: 0x2b (PANIC_STACK_SWITCH) =此错误通常在内核模式驱动程序使用过多堆栈空间时出现。当内核中发生严重的数据损坏时也会出现这种情况。裁判:https://msdn.microsoft.com/en-us/library/windows/hardware/ff557460 (v = vs.85) . aspx
所以,我不明白为什么它不能运行我的函数,我不明白为什么它会崩溃。如果有人有任何想法,将不胜感激;因为,我知道这是一个相当压倒性的小话题的信息,可能只适用于我的情况。我可以假设堆栈重载或无效转换类型char*?]
谢谢。
您还没有呼叫connect
当然connect
需要一个远程地址,但您只有一个名称。因此,您需要通过调用gethostbyname
将名称转换为地址。
一旦你有了一个地址,顺序是:
-
socket
创建socket对象 -
bind
将连接的本端绑定到本地地址和端口。Bind连接socket的端。 -
connect
连接流套接字到远程主机。
这里不需要使用hton*
系列函数。它们是用来转换你在网络上收到的号码的。
备注:看起来对socket
和bind
的调用应该合并,不是吗?他们没有的原因是历史的——这就是现在的工作方式。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- C++:TypeDef使用元组
- 使用std::multimap迭代器创建std::list
- 从不同线程使用int64的不同字节安全吗
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么在全局范围内使用"extern int a"似乎不行?
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用Google Mock来模拟gettimeofday()
- 如何使用默认参数等选择模板专业化
- 为什么使用 "this" 指针调用派生成员函数?
- 使用新行和不使用新行读取文件
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 如何确定我已使用非编码文件到达 EOF?
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 使用CMake创建QML插件
- 使用strcpy将char数组的元素复制到另一个数组
- 有谁知道任何尝试在C / C++中使用libevent实现Web Sockets API
- (GET HTTP请求)c++ sockets使用winsock.h
- 如何模拟一个客户端服务器应用程序,我写在c++使用windows sockets