将指针转换为字符串并作为 char 数组发送无法正常工作
Converting pointer to string and send as char array not working properly
我在从我的 C++ 客户端通过套接字向我的 Java 服务器发送目录名称时遇到问题。
发送像 "hello world" 这样的普通消息,效果很好,但以下没有,我无法弄清楚问题是什么:
char const * files = ffd.cFileName; // get directory name
string str(files, 0, strlen(files)); // convert pointer to string, right?
char mess[str.size()];
strcpy(mess, str.c_str()); // make char array :)
cout << "Send file: " << mess << " with strlen: " << strlen(mess) << " and sizeof: " << sizeof(mess) << endl;
int sent = 0;
if ((sent = send(connectSocket, mess, sizeof(mess), 0)) == SOCKET_ERROR)
{
closesocket(connectSocket);
WSACleanup();
connectToServer();
}
java 服务器只接收这样的目录名称:
wam
p
Win
dow
s
Win
dow
s.o
ld
wxW
idg
ets
我不明白我错过了什么,因为我已经尝试了所有可能的方法来做到这一点并且 C++ 客户端打印如下:
"Send file: windows with strlen: 7 and sizeof: 7"
我认为 java 服务器不是问题,因为我可以完美地接收正常的字符串和消息,但无论如何这是 JAVA 代码:
is = socket.getInputStream();
byteArray = new byteArray[1024];
while (true) {
c = is.read(byteArray, 0, byteArray.length);
String recv = new String(byteArray, 0, c);
System.out.println(recv);
if (recv.equals("<EOF>")){
break;
}
list.add(recv);
}
如果您有其他要求,请留下评论,我会解决的。
问题:您是通过 TCP 还是 UDP 发送?我猜是 TCP,如果是这种情况,您需要将套接字视为更多的流。该流可能会分解成一堆数据包 - 你并不能真正控制它。我可能做的是为每个目录(ex、3foo、4barz 等)的字符串长度添加前缀,从套接字读取并确定什么构成逻辑块或字符串,然后 assemble / 打印基于的字符串在那上面。如果你走那条路,你需要跟踪你每次读了多少,直到你认为你读完了。
我解决了,刚刚添加 byteArray = new byte[1024];
现在它可以工作了:
while (true) {
byteArray = new byte[1024]; // I ADDED THIS AND NOW THE JAVA SERVER RECEIVES IT CORRECTLY!
c = is.read(byteArray, 0, byteArray.length);
recv = new String(byteArray, 0, c);
System.out.println(recv);
if (recv.equals("<EOF>")){
break;
}
list.add(recv);
}
我在从我的 C++ 客户端通过套接字向我的 Java 服务器发送目录名称时遇到问题。
发送像 "hello world" 这样的普通消息,效果很好,但以下没有,我无法弄清楚问题是什么:
char const * files = ffd.cFileName; // get directory name
string str(files, 0, strlen(files)); // convert pointer to string, right?
char mess[str.size()];
strcpy(mess, str.c_str()); // make char array :)
cout << "Send file: " << mess << " with strlen: " << strlen(mess) << " and sizeof: " << sizeof(mess) << endl;
int sent = 0;
if ((sent = send(connectSocket, mess, sizeof(mess), 0)) == SOCKET_ERROR)
{
closesocket(connectSocket);
WSACleanup();
connectToServer();
}
java 服务器只接收这样的目录名称:
wam
p
Win
dow
s
Win
dow
s.o
ld
wxW
idg
ets
我不明白我错过了什么,因为我已经尝试了所有可能的方法来做到这一点并且 C++ 客户端打印如下:
"Send file: windows with strlen: 7 and sizeof: 7"
我认为 java 服务器不是问题,因为我可以完美地接收正常的字符串和消息,但无论如何这是 JAVA 代码:
is = socket.getInputStream();
byteArray = new byteArray[1024];
while (true) {
c = is.read(byteArray, 0, byteArray.length);
String recv = new String(byteArray, 0, c);
System.out.println(recv);
if (recv.equals("<EOF>")){
break;
}
list.add(recv);
}
如果您有其他要求,请留下评论,我会解决的。
问题:您是通过 TCP 还是 UDP 发送?我猜是 TCP,如果是这种情况,您需要将套接字视为更多的流。该流可能会分解成一堆数据包 - 你并不能真正控制它。我可能做的是为每个目录(ex、3foo、4barz 等)的字符串长度添加前缀,从套接字读取并确定什么构成逻辑块或字符串,然后 assemble / 打印基于的字符串在那上面。如果你走那条路,你需要跟踪你每次读了多少,直到你认为你读完了。
我解决了,刚刚添加 byteArray = new byte[1024];
现在它可以工作了:
while (true) {
byteArray = new byte[1024]; // I ADDED THIS AND NOW THE JAVA SERVER RECEIVES IT CORRECTLY!
c = is.read(byteArray, 0, byteArray.length);
recv = new String(byteArray, 0, c);
System.out.println(recv);
if (recv.equals("<EOF>")){
break;
}
list.add(recv);
}