【问题标题】:fail to read message on the client end using C无法使用 C 在客户端读取消息
【发布时间】:2013-01-16 05:39:48
【问题描述】:

我使用协议缓冲区来构建数据结构,并在服务器端编写以下代码以使用 Java 发送消息,而在客户端使用 C 接收消息。

Java 服务器:

OutputStream os = socket.getOutputStream();
GameResponse.Builder builder=GameResponse.newBuilder();
builder.build().writeTo(os);
os.flush();
os.close();

C 客户端:

while ((n = ::recv(sockfd, buf, BUFFLEN, 0)) > 0) {
    write(STDOUT_FILENO, buf, n);
    len += n;
}

原来服务器发送的消息是正确的,但客户端无法接收。看起来while循环永远不会中断它进入死循环。我们认为这可能是 C recv 函数从未获得 EOF 来结束数据传输的原因......

【问题讨论】:

  • 试试writeDelimitedTo(os),为什么你不在客户端使用protobuf API?
  • 你确定os.close() 真的关闭了套接字吗? recv 函数只有在连接断开时才会返回 0,否则会挂起等待数据。
  • 我不负责客户端接收......他们想使用原始C代码来处理socket......

标签: java c sockets protocol-buffers


【解决方案1】:

如果连接已关闭,recv() 返回0

要从客户端关闭连接,请通过调用 socket.close() 关闭套接字。

【讨论】:

  • 其实客户端socket在接收到服务器端的数据后就关闭了……我也在服务器端写了socket.close()……另外,这里还有一个接收数据的问题服务器端的客户端。这是link。如果您能帮助我,我将不胜感激!
  • @RyanZhu:我刚刚意识到我在回答中混淆了服务器和客户端。对不起!
  • 一点都没有……事实上,我真的发现一旦我在客户端关闭了套接字,我就可以正确获取数据……但是不允许客户端关闭,因为它仍然有从服务器接收数据的责任......所以......我必须寻找另一种方法来解决这个问题......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-30
  • 2014-01-17
  • 2019-01-25
  • 2013-09-24
  • 1970-01-01
  • 2015-10-08
  • 2020-04-17
相关资源
最近更新 更多