2013-03-01 116 views
0

我試圖通過UDP套接字發送結構,我收到DRB_count的值正確但無法接收KenbStar的值。我究竟做錯了什麼?我使用同一臺機器,在客戶機和服務器上使用同一端口回送ip 127.0.01。通過UDP套接字C++發送結構

客戶端:

typedef struct tseTargetCellInformation{ 
    UInt8 DRB_count;      
    UInt8 *KenbStar; 
}tTargetCellConfiguration; 

trecTargetCellConfiguration *rx_TargetCellConfiguration_str; 

rx_TargetCellConfiguration_str = (trecTargetCellConfiguration*)malloc(sizeof(trecTargetCellConfiguration)); 

send_TargetCellConfiguration_str->DRB_count=1; 
send_TargetCellConfiguration_str->KenbStar = (UInt8*) malloc(1); 
send_TargetCellConfiguration_str->KenbStar[0]= 0x5b; 

sendto(sd, (char *) (send_TargetCellConfiguration_str), sizeof(tTargetCellConfiguration), 0, (struct sockaddr *)&server, slen) 

服務器:

typedef struct tseTargetCellInformation{ 
    UInt8 DRB_count;      
    UInt8 *KenbStar; 
}tTargetCellConfiguration; 

rx_TargetCellConfiguration_str->KenbStar = (UInt8*) malloc(1); 

recvfrom(sd, (char *) (rx_TargetCellConfiguration_str), sizeof(trecTargetCellConfiguration), 0, (struct sockaddr*) &client, &client_length); 
+2

這看起來不像'C++'。 – 2013-03-01 11:39:42

回答

2

因爲KenbStar是一個指針,你必須dereference以發送值,它指向,或獲得的價值。否則,你只是發送和接收指針(即不是指向的內容),這通常根本沒有意義(特別是如果客戶端和服務器是不同的進程)。

換句話說,是這樣的:

sendto(sd, (char *) send_TargetCellConfiguration_str->KenbStar, sizeof(UInt8), ... 

recvfrom(sd, (char *) rx_TargetCellConfiguration_str->KenbStar, sizeof(UInt8), ... 

然而,或許這將是最容易的KenbStar正式會員,就像DRB_count,除非你有特殊原因爲什麼它必須是一個指針。然後你可以用一次調用發送(並接收)整個結構。

+0

感謝,它的工作,但只對指針變量,結構中的其餘變量呢?我有以下str通過UDP發送。我該怎麼辦 ? – 2013-03-01 13:13:10

+0

如果你的值分散在內存中(即不連續),那麼你需要幾個sendto調用。通常情況下,最好是將所有數據收集在一個連續的塊中(一個結構只包含值,即無指針),然後通過一次調用發送(和接收)數據。 – Reunanen 2013-03-01 13:21:00

0

你不能發送指針到一個內存空間到另一個內存空間,並期望它指向相同的東西,特別是當你沒有發送它指向的內容時。通過網絡發送未編碼的結構對於其他十幾個原因來說也是不可能的。您需要調查一些表示層,例如XDR。

+0

可以給我發送一些鏈接,我可以找到這個主題,我想你談論編碼的str,然後發送它的套接字,然後在另一端解碼 – 2013-03-01 15:10:02

+0

你可以谷歌XDR以及我可以,那應該引導你到幾個更現代的選擇。 – EJP 2013-03-01 22:11:43

+0

我試過XDR庫來對消息進行編碼,然後通過套接字對它進行解碼,但是在解碼端,我得到了一些不需要的字符,然後是我的解碼消息。 我這樣做: – 2013-03-05 09:31:51