Хорошо, прежде чем кто-то сделает поспешные выводы (и сделаю это из-за того, что я сохраняю это отношение к другим), в основном, я пытаюсь сделать
Получить запрос с сокетами в C / C ++ используя Winsock.h.
[Основная проблема, возникающая при запуске функции SocketRequest]
Я получаю коды ошибок в любом месте:
«WSAENOTCONN 10057» — «WSAENOTSOCK 10038», и я нашел больше информации об этом здесь: https://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx
Теперь, это будет немного неуместно для других, но больше для моей ситуации.
Я пытаюсь реализовать это на XBOX360 Devkit, используя «winsockx.h», и он вылетает, когда я делаю «SocketRequest» … вот код С вывод для целей отладки. (Я понимаю, что обычно это не то, что вы видите, поэтому принимайте это так, как хотите)
Вот включенные файлы:
#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.0\r\nHOST: ");
strcat(serverAddr, URL);
strcat(serverAddr, "\r\n\r\n");
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, "Null\n\n"));
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
код остановки: 0x2b (PANIC_STACK_SWITCH) = Эта ошибка обычно появляется, когда драйвер режима ядра использует слишком много стекового пространства. Это также может появиться, когда в ядре происходит серьезное повреждение данных.
ссылка: https://msdn.microsoft.com/en-us/library/windows/hardware/ff557460(v=vs.85).aspx
В общем, я не понимаю, почему не работает моя функция, я не могу понять, почему это происходит сбой. Если у кого-то есть какие-либо идеи, это будет с благодарностью; как я понимаю, это довольно обширная тема информации, которая может относиться только к моей ситуации.
[Я могу предположить перегрузку стека или неправильное преобразование типа char *?]
Благодарю.
Ты не звонил connect
Конечно connect
требуется удаленный адрес, но у вас есть только имя. Таким образом, вам нужно преобразовать имя в адрес, позвонив gethostbyname
,
Когда у вас есть адрес, последовательность выглядит следующим образом:
socket
создать объект сокета.bind
привязать локальный конец соединения к локальному адресу и порту. Bind соединяет твой конец розетки.connect
подключить потоковый сокет к удаленному хосту.И вам не нужно использовать hton*
семейство функций здесь. Они предназначены для преобразования номеров, которые вы получили по сети.
Замечания: это, безусловно, выглядит как призыв к socket
а также bind
должны быть объединены, не так ли? Причина, по которой они не являются историческими, — вот как это работает сейчас.
Других решений пока нет …