【发布时间】:2015-05-16 13:21:09
【问题描述】:
我在通过套接字从我的 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++ 客户端打印如下:
"发送文件: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);
}
如果您有其他要求或任何事情,请发表评论,我会解决它。
【问题讨论】:
-
请注意
mess包含str.size()字节,然后您将str.size() + 1字节写入其中。 -
你如何发送“像 Hello World 这样的普通消息”?
-
string str(files, 0, strlen(files));可以简化为string str(ffd.cFileName);如果它的 cFileName 是一个以空值结尾的字符串。 -
另外,不要创建不必要的字符缓冲区
mess,只需将您的发送调用更改为send(connectSocket, str.c_str(), str.length(), 0) -
它在您的服务器上被拆分,因为 TCP 是基于流的。
is.read()在客户端完成发送其完整消息之前到达其内部接收缓冲区的末尾,因此它只打印它到目前为止收到的内容。
标签: java c++ pointers char send