2013-07-07 141 views
0

我正在編寫一個通過套接字發送XDR結構的服務器。 使用Wireshark我看到我的客戶端正確地發送XDR消息到服務器,但我沒有看到任何數據從服務器到客戶端。但代碼似乎是正確的,因爲它與客戶端使用的代碼相同。我已經看到問題是xdr_Response。它有什麼錯誤嗎?感謝所有通過Linux中的C使用套接字發送XDR結構

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; 
+1

您可以使用例如['strace'](http://linux.die.net/man/1/strace)命令可以幫助您跟蹤系統調用,希望能夠包含由您的XDR功能所做的調用。然後你可以看到失敗的事情。 –

+0

順便說一下,'xdr_Response'能返回一些錯誤代碼嗎?你檢查過了嗎? –

+0

是的,xdr_Response返回一個錯誤 – user2467899

回答

1

我不是XDR的很內行,但我發現的方式,努力從XDR接收數據與套接字連接(基於TCP)。首先,您必須執行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即可。

相關問題