strtok() 更改我的缓冲区,我需要存储一些在任意时间更改的数据,我该怎么做?

strtok() change my buffer, I need stored some data that change in an arbitrary time, how can I do this?

我有一个列表,其中包含从 Python 服务器像缓冲区一样发送到 C++ 客户端的坐标,然后我需要拆分每个坐标,为此我使用了 strtok(),但是当函数被标记化时第一次正确地做,当我的 while 循环重复并收到一个新的坐标列表时,函数 returns 之前第一个标记拆分,我需要保存新的坐标列表并将其拆分为标记,就像第一个一样时间,有人知道我的问题是什么或不使用 strtok() 解决问题的更好方法吗?

这是我的 C++ 客户端代码

#define _CTR_SECURE_NO_WARNINGS
#include <stdio.h>  
#include <Winsock2.h>  
#pragma comment(lib,"ws2_32.lib")
#pragma warning(disable:4996)
#include <iostream>
#include <sstream>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <typeinfo>

using namespace std;

int main()
{
    char delimitador[] = ",";
    WORD wVersionRequested;
    WSADATA wsaData;
    int err, N;
    char* length;
    string D, Coordenada;

    wVersionRequested = MAKEWORD(1, 1);

    err = WSAStartup(wVersionRequested, &wsaData);
    if (err != 0) {
        return -1;
    }

    if (LOBYTE(wsaData.wVersion) != 1 ||
        HIBYTE(wsaData.wVersion) != 1) {
        WSACleanup();
        return -1;
    }
    SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);

    SOCKADDR_IN addrSrv;
    addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    addrSrv.sin_family = AF_INET;
    addrSrv.sin_port = htons(2070);
    connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));

    const char* baseCh = { "hello" };
    char recvBuf[50], expected[50];

    send(sockClient, baseCh, strlen(baseCh), 0);

        while (1 == 1)
        {

            recv(sockClient, recvBuf, strlen(recvBuf), 0);

            strcpy(expected, recvBuf);  

            char *token = strtok(expected, delimitador);
            if (token != NULL); {
                while (token != NULL) {
                    printf("Token %s\n", token);
                    token = strtok(NULL, delimitador);
                }
            }

            send(sockClient, baseCh, strlen(baseCh), 0);

        }

    closesocket(sockClient);
    WSACleanup();

    getchar();
    return 0;
}

这是我的Python服务器代码

import socket
import time

def main():
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind(("localhost", 2070))
    server.listen(0)
    connection, address = server.accept()
    Hand = []
    while True:

        recv_str=connection.recv(1024)[0:5]
        print("enter 1")
        recv_str=recv_str.decode("ascii")
        if not recv_str:
            break
        print( recv_str)
        
        while True:
            time.sleep(0.5)
            Hand.append(1)
            Hand.append(20)
            Hand.append(25)
            connection.send( bytes("%s," %Hand, encoding="ascii"))
            recv_str=connection.recv(1024)[0:5]
            print(Hand)
            print(recv_str)
            Hand = []
            
    connection.close()
    input("enter end")

if __name__ == '__main__':
   main()

enter image description here

我已经输入了我使用的正确代码,主要问题是我需要在未定义的时间连续接收来自 Python 服务器的消息,该消息是一组坐标,以及如何你可以看到函数 strtok() 改变了我的缓冲区,我只需要拆分数据而不改变原始缓冲区变量,就像我的第一个标记化结果但是每次我的缓冲区改变时。

我的问题不是我的 strtok() 函数,在阅读了我的一个古老问题 post 后,我意识到我的问题出在 recv() 函数中,我的更正是

recv(sockClient, recvBuf, strlen(recvBuf), 0);

recv(sockClient, recvBuf, sizeof(recvBuf), 0);

这解决了我的问题,最后,我可以从 Python 服务器接收到 C++ 客户端的连续数据。