2014-10-17 134 views
-1

我正在寫一個基於udp的客戶端/服務器,我想發送一個序列號以及每個數據報,我試圖通過udp使用#pragma或pack結構發送結構沒有運氣。通過udp套接字發送一個結構

typedef struct { 
char buf[BUF_SIZE]; //buffer size is 4096 
int seq; 
} pack; 

當我嘗試發送大小爲131094位的文件時,我在另一端接收到135300位的文件。我的問題是,有沒有辦法做到這一點沒有序列化?

+1

這是完全可能的,即使潛在的不明智,你需要給我們更多的代碼和更多的信息來幫助你。 – Joe 2014-10-17 08:21:00

+0

[從結構發送數據,套接字編程]的可能的重複(http://stackoverflow.com/questions/20000257/sending-data-from-a-struct-socket-programming) – SSC 2014-10-17 08:29:27

+2

是的,這完全是可能的 - 如果有這是發送/接收代碼中的問題。 – Useless 2014-10-17 08:34:29

回答

0
n = recvfrom(sd,&pkt,sizeof(pkt),0,(struct sockaddr *)&clt,&l); 

這裏n將是-1或整個接收數據包的大小,包括序列號字。

write(fd, pkt.buf,n) 

這裏n仍然是整個接收數據包的大小。您不會從數據包長度中減去序列號的大小,因此您每寫入一次就要寫入額外的字節數。你應該叫

write(fd, pkt.buf, n-sizeof int); 

但是在我看來,這些包也應該包含自己的長度,以應付情況的數據不是4096個字節的整數倍。

+0

謝謝我改變了這一點,但仍然沒有解決問題 – TicTac 2014-10-17 10:03:37