2016-11-18 146 views
0

如何以C++的UDP sendto結構發送數據?以UDP結構發送數據sendto

struct routingTable{ 
    int numServers; 
    int numNeighbors; 
    int selfId,neighborNode[5]; 
    int Cost[6][6]; 
}; 

routingTable selfRoutingTable; 
sendto(listener_socket,<This is a char *> , strlen(my_message), 0, (struct sockaddr *)&nbaddr, sizeof(nbaddr) 
+1

錯誤,帶有一個強制轉換,'sizeof'而不是'strlen()',但是你不應該這樣做。不要使用結構作爲網絡協議。 – EJP

回答

3
sendto(listener_socket,<This is a char *> , strlen(my_message), 0, (struct sockaddr *)&nbaddr, sizeof(nbaddr) 

不,這不是,這是一個const void *。從a man page

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, 
       const struct sockaddr *dest_addr, socklen_t addrlen); 

從技術上講,你可以用你的發送結構:&selfRoutingTable和使用sizeof的大小,但請參見下文。


由於EJP提到這是一個非常糟糕的主意,你會很快與不同的實現結構的表示和領域遇到的問題(你會發現所有關於結構場填補之類)。

查看序列化機制(json,capnproto,protobufs,xml,asn.1什麼)。


我現在認識到,「不,它不是」並非總是如此。顯然MSDN lists sendto as taking a const char *

int sendto(
    _In_  SOCKET    s, 
    _In_ const char     *buf, 
    _In_  int     len, 
    _In_  int     flags, 
    _In_  const struct sockaddr *to, 
    _In_  int     tolen 
); 

想法(將指針傳遞給任何人想要的)的立場。

0

這樣做的幾種方法:

1)手動打包數據到內存緩衝區。 對於x64處理器:

unsigned char *buf = new unsigned char[1024]; 
unsigned char *p = buf; 
*(int *)p = rt.numServers; p += sizeof(int); 
*(int *)p = rt.numNeigbors; p += sizeof(int); 

這樣每個值將有固定的根據在發送側的int大小在緩衝液中的偏移量。接收方需要從接收數據緩衝區解壓數據:

unsigned char *buf; 
int *p = buf; 
rt.numServers = *p; p++; 

發送端和接收端可能有不同的int長度,所以你可能需要更改代碼。

包裝數據的另一種方式(對於32位int)將是:

unsigned char *buf; 
buf[0] = rt.numServers & 0xff000000; 
buf[1] = rt.numServers & 0x00ff0000; 
buf[2] = rt.numServers & 0x0000ff00; 
buf[3] = rt.numServers & 0x000000ff; 

buf[4] = rt.numNeighbors & 0xff000000; 

2)使用編譯器擴展包裝中順序地結構數據,而不會因爲對準的自由空間。在https://en.wikipedia.org/wiki/Data_structure_alignment#Typical_alignment_of_C_structs_on_x86 中描述了這種方法,您可以將#pragma(用於gcc)添加到結構定義中,並使用指針和sizeof()發送它。 發送結構會是什麼樣子:

routingTable selfRoutingTable; 
unsigned char buf[1024]; 
memcpy(buf, &selfRoutingTable, sizeof(selfRoutingTable)); 

3)cnicutar勸使用XML或JSON發送數據。它速度較慢並且增加了數據包大小,但更容易支持和調試。