SF | Способ передачи данных по сети

ANZR

Известный
Автор темы
168
104
Хаюшки
Это вопрос для шарющих.
Те, кто интересовался работой сокетов на c++ и знают, что это такое
У меня к вам вопрос
Как можно передать данные между игроками/пользователями через интернет, т.к либ для работы с сокетом я не нашел в SF, а методы, что работают в обычном проекте тут не прокатывают.
 
Решение
Окс


с++:
#include <Windows.h>
#include "main.h"
#pragma comment(lib, "ws2_32.lib")
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <iostream>

#pragma warning(disable: 4996)

SOCKET Connection;

SAMPFUNCS *SF = new SAMPFUNCS();

bool CALLBACK outcomingData(stRakNetHookParams *params) // определение callback-функции, которая будет вызвана при отправке какого либо пакета
{
    if (params->packetId == 93) {

        UINT32 dColor;
        UINT32 messageLen;
        params->bitStream->ResetReadPointer();
        params->bitStream->Read(dColor);
        params->bitStream->Read(messageLen);
        char *msg = new char[messageLen];
        params->bitStream->Read(msg, messageLen)...

ANZR

Известный
Автор темы
168
104
Все там прокатывает... Опиши конкретнее, в чем ошибка
Крч, подключаю либу с сокетом
Вроде пишет, что она есть, даже ее открывает, но при создании той же самой структуры, говорит, что она не объявлена
 

memir

🇷🇺
Всефорумный модератор
333
597
Крч, подключаю либу с сокетом
Вроде пишет, что она есть, даже ее открывает, но при создании той же самой структуры, говорит, что она не объявлена
покажи код и что пишет студия
 

ANZR

Известный
Автор темы
168
104
iJTOyTk.png
 

ANZR

Известный
Автор темы
168
104

ANZR

Известный
Автор темы
168
104
А можно в виде кода, а не скриншота?
Окс


с++:
#include <Windows.h>
#include "main.h"
#pragma comment(lib, "ws2_32.lib")
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <iostream>

#pragma warning(disable: 4996)

SOCKET Connection;

SAMPFUNCS *SF = new SAMPFUNCS();

bool CALLBACK outcomingData(stRakNetHookParams *params) // определение callback-функции, которая будет вызвана при отправке какого либо пакета
{
    if (params->packetId == 93) {

        UINT32 dColor;
        UINT32 messageLen;
        params->bitStream->ResetReadPointer();
        params->bitStream->Read(dColor);
        params->bitStream->Read(messageLen);
        char *msg = new char[messageLen];
        params->bitStream->Read(msg, messageLen);

        SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xAA, 0), msg);
        params->bitStream->ResetReadPointer();

    }
    return true; // успешно завершаем отправку пакета
};

void __stdcall mainloop()
{
    static bool initialized = false;
    if (!initialized)
    {
        if (GAME && GAME->GetSystemState() == eSystemState::GS_PLAYING_GAME && SF->getSAMP()->IsInitialized())
        {
            initialized = true;
            SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xAA, 0), "SAMPFUNCS Plugin loaded.");
            SF->getRakNet()->registerRakNetCallback(RakNetScriptHookType::RAKHOOK_TYPE_INCOMING_RPC, outcomingData); // регистрируем RakNet callback

            WSAData wsaData;
            WORD DLLVersion = MAKEWORD(2, 1);
            if (WSAStartup(DLLVersion, &wsaData) != 0) {
                std::cout << "Error" << std::endl;
                exit(1);
            }

            SOCKADDR_IN addr;
            int sizeofaddr = sizeof(addr);
            addr.sin_addr.s_addr = inet_addr("127.0.0.1");
            addr.sin_port = htons(3253);
            addr.sin_family = AF_INET;

            Connection = socket(AF_INET, SOCK_STREAM, NULL);
            if (connect(Connection, (SOCKADDR*)&addr, sizeof(addr)) != 0) {
                SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xAA, 0), "Error connected to server!");
            }
            else {
                SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xAA, 0), "Connected!");
            }
        }
    }
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
    if (dwReasonForCall == DLL_PROCESS_ATTACH)
        SF->initPlugin(mainloop, hModule);
    return TRUE;
}
 

ALF

Известный
Проверенный
320
537
Окс


с++:
#include <Windows.h>
#include "main.h"
#pragma comment(lib, "ws2_32.lib")
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <iostream>

#pragma warning(disable: 4996)

SOCKET Connection;

SAMPFUNCS *SF = new SAMPFUNCS();

bool CALLBACK outcomingData(stRakNetHookParams *params) // определение callback-функции, которая будет вызвана при отправке какого либо пакета
{
    if (params->packetId == 93) {

        UINT32 dColor;
        UINT32 messageLen;
        params->bitStream->ResetReadPointer();
        params->bitStream->Read(dColor);
        params->bitStream->Read(messageLen);
        char *msg = new char[messageLen];
        params->bitStream->Read(msg, messageLen);

        SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xAA, 0), msg);
        params->bitStream->ResetReadPointer();

    }
    return true; // успешно завершаем отправку пакета
};

void __stdcall mainloop()
{
    static bool initialized = false;
    if (!initialized)
    {
        if (GAME && GAME->GetSystemState() == eSystemState::GS_PLAYING_GAME && SF->getSAMP()->IsInitialized())
        {
            initialized = true;
            SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xAA, 0), "SAMPFUNCS Plugin loaded.");
            SF->getRakNet()->registerRakNetCallback(RakNetScriptHookType::RAKHOOK_TYPE_INCOMING_RPC, outcomingData); // регистрируем RakNet callback

            WSAData wsaData;
            WORD DLLVersion = MAKEWORD(2, 1);
            if (WSAStartup(DLLVersion, &wsaData) != 0) {
                std::cout << "Error" << std::endl;
                exit(1);
            }

            SOCKADDR_IN addr;
            int sizeofaddr = sizeof(addr);
            addr.sin_addr.s_addr = inet_addr("127.0.0.1");
            addr.sin_port = htons(3253);
            addr.sin_family = AF_INET;

            Connection = socket(AF_INET, SOCK_STREAM, NULL);
            if (connect(Connection, (SOCKADDR*)&addr, sizeof(addr)) != 0) {
                SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xAA, 0), "Error connected to server!");
            }
            else {
                SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xAA, 0), "Connected!");
            }
        }
    }
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
    if (dwReasonForCall == DLL_PROCESS_ATTACH)
        SF->initPlugin(mainloop, hModule);
    return TRUE;
}

#include <Windows.h>- удали
#include "main.h" - после всех инклюдов
 

ALF

Известный
Проверенный
320
537