【问题标题】:Send a XDR struct over a socket with C in Linux在 Linux 中使用 C 通过套接字发送 XDR 结构
【发布时间】:2017-04-11 10:09:58
【问题描述】:

我正在编写一个通过套接字发送 XDR 结构的服务器。 使用 Wireshark,我看到我的客户端正确地将 XDR 消息发送到服务器,但我没有看到任何数据从服务器传输到客户端。但是代码似乎是正确的,因为它与客户端使用的代码相同。我已经看到问题是 xdr_Response。它有什么错误吗?谢谢大家

XDR xdrs_w;
Response y;

stream_socket_w = fdopen(s, "w");
xdrstdio_create(&xdrs_w, stream_socket_w, XDR_ENCODE);

y.error = 0; 
y.result = 5.7;

xdr_Response(&xdrs_w, &y);
fflush(stream_socket_w);

与:

struct Response {
    bool_t error;
    float result;
};
typedef struct Response Response;

【问题讨论】:

  • 你可以使用例如strace 命令可帮助您跟踪系统调用,希望包括由您的 XDR 函数生成的调用。然后你可以看到失败之类的东西。
  • 顺便问一下,xdr_Response 可以返回一些错误代码吗?你检查过吗?
  • 是的,xdr_Response 返回错误

标签: c linux sockets xdr


【解决方案1】:

我不是 XDR 方面的专家,但我找到了一种通过套接字连接(在 TCP 上)从 XDR 接收数据的方法。首先,您必须执行 recv 以从客户端接收数据,然后调用 xdrmem_create(),这需要您将用于读取的 XDR 结构、缓冲区(字符串)、recv() 的返回值,以及您必须使用 XDR_DECODE,因为您是从已编码的 XDR 编写的。

你必须这样写:

l = recv(socket, buffer, BUFFERDIM, 0);
xdrmem_create(&xdrs_w, buff, l, XDR_DECODE );
if(!xdr_Response(&xdrs_w, &y) {
fprintf(stdout, "Error XDR\n");
}
fprintf(stdout, "Received: %f", y.result);

y应该填写。注意bufferbuff不同。我更喜欢这样做而不是使用 fd_open,您只需创建 xdr 并调用 xdr_Response

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 2013-07-22
    • 2016-06-06
    • 2018-06-26
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    相关资源
    最近更新 更多