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++ 客户端的连续数据。
我有一个列表,其中包含从 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++ 客户端的连续数据。