我已经学习了Java近8个月,并决定学习一些c ++。
我有一个Java服务器,等待客户端连接(C ++客户端)。
当客户端连接时,我在 java 服务器中正在做什么:
连接时 C ++ 客户端正在做什么:
Java中的相关代码:
String message;
byte[] byteArray = new byte[1024];
while (true) {
System.out.println("Enter message: ");
message = sc.nextLine(); // Enter message
byteArray = message.getBytes("UTF-8"); // Get bytes of message
out.write(byteArray); // Send the Message
}
C ++中的相关代码:
std::cout << "Connected!";
while (true)
{
char buff[1024];
if (what = recv(u_sock, buff, sizeof(buff), 0) < 0)
{
cout << "Error receiving message " << WSAGetLastError() << endl;
}
else
{
cout << "Message: " << buff << endl;
}
}
实际问题: 当我从Java发送字符串“asd”时,我收到C ++中的“asd”,一个笑脸和文本winsock2.0。有时我只是收到上一条消息而不是当前发送的消息。可能是什么问题? 当我尝试从C ++客户端向Java服务器发送消息时,它有效。
答案 0 :(得分:2)
接收的数据不是以NULL结尾的。要解决这个问题,你应该使用NULL终止它们:
if ((what = recv(u_sock, buff, sizeof(buff)-1, 0)) < 0)
{
⋮
}
else
{
buff[what] = 0;
cout << buff << endl;
}
答案 1 :(得分:2)
我在C ++中收到“asd”,笑脸,文本winsock2.0。
不。那东西已经在缓冲区了。这里的问题是你忽略了recv()
返回的长度。您必须使用它来界定您打印的buff
的大小,谢天谢地我忘记了如何在C ++流中进行操作。
您还必须将其检查为零,这意味着对等方关闭了连接。在错误和零情况下,除非错误是EAGAIN / EWOULDBLOCK,否则还应关闭套接字并跳出循环。