Cpp Server Socket не отправляет данные в игре GTA-5 - PullRequest
0 голосов
/ 07 ноября 2018

Я создаю сокет для отправки целого числа из игры GTA-5 клиенту Python через неблокирующий сокет. Когда я запускаю сокеты с тестовыми данными (не в игре), он работает отлично. Но при запуске в игре клиент просто печатает «Подключено к серверу» и данные не принимаются. В чем может быть проблема? Как мне это исправить?

Код на стороне сервера

bool serverSocket (int reward) {
    int s;
    struct sockaddr_in servAddr;
    struct sockaddr_in clntAddr;

    int clntAddrLen; //length of client socket address

    WSADATA mywsadata; //your wsadata struct, it will be filled by WSAStartup
    WORD DllVersion = MAKEWORD(2, 1);
    if (WSAStartup(DllVersion, &mywsadata) != 0) { //DllVeersion refers to version of sockets we want to use.
        return 0;
    }

    //Build local (server) socket add
    servAddr.sin_family = AF_INET;
    servAddr.sin_port = htons(SERVER_PORT);
    servAddr.sin_addr.s_addr = INADDR_ANY;

    //create socket
    s = socket(AF_INET, SOCK_STREAM, 0);
    if (s <0)
    {
        return 0;
    }

    //bind socket to local address and port
    if ((bind(s, (struct sockaddr*)&servAddr, sizeof(servAddr))<0))
    {
        return 0;
    }

    //set socket in a state where it listens for incoming connections
    if (listen(s, 10) <0) {
        return 0;
    }

    SOCKET client = SOCKET_ERROR;

    // Set listen socket to non blocking mode
    u_long mode = 1;    //any non zero no. sets it to non blocking mode
    ioctlsocket(s, FIONBIO, &mode);

    FD_SET readfds;
    FD_ZERO(&readfds);
    FD_SET(s, &readfds);
    timeval timeperiod;
    timeperiod.tv_usec = 5;

    select(0, &readfds, NULL, NULL, &timeperiod);
    if (FD_ISSET(s, &readfds)) {
        client = accept(s, NULL, NULL);
        if (client == SOCKET_ERROR) {
            return 0;
        }
        FD_SET(client, &readfds);
    }
    if (FD_ISSET(client, &readfds)) {
        char reward[20] = "server msg";
        int32_t r = 100;
        std::string r_str = std::to_string(r);

        char buffer[6];
        strncpy_s(buffer, r_str.c_str(), sizeof(buffer));
        //send string
        send(client, (char*)&buffer, sizeof(buffer), 0);
    }
    closesocket(s);
    return 1;
}

Код на стороне клиента

HOST, PORT ='localhost', 50007

def get_data():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((HOST, PORT))

    print("connected to Server")

    data = s.recv(6)

    print(data)
    data = data.partition(b'\x00',)[0]
    data = data.decode('utf-8')
    print(int(data))
    s.close()



if __name__ == '__main__':
    get_data()
...