簡體   English   中英

我如何找到由套接字SOCK_DGRAM選項創建的ip / udp標頭

[英]how can i find ip/udp header while it created by socket SOCK_DGRAM option

誰能告訴我如何通過套接字類型SOCK_DGARM選項創建的ip/udp標頭。在我的VOIP應用程序中,同時此選項設置sendto()函數僅發送RTP數據,而不發送IP/UDP/RTP標頭和數據的整個緩沖區。為什么我要找到在哪里創建IP/UDP標頭的人,所以誰能告訴我在哪一點找到它。

error = sendto (sockfd, (char*)m->b_rptr, (int) (m->b_wptr - m->b_rptr),
         0,destaddr,destlen);

在這里, m->b_rptr指出rtp標頭和數據。 並且僅此發送和接收。

您可以使用數據包捕獲工具(如tcpdump或Wireshark)找到它。 您無法直接通過sendto()函數調用訪問底層協議的詳細信息-操作系統會為您精心制作標頭,通常您無需查看它們。 但是在發送端或接收端捕獲的數據包都會向您顯示標頭。

使用套接字API,您無需創建IP / UDP標頭。 操作系統將自動填充適當的標題。 您所需要做的就是創建RTP數據包並將其封裝在UDP數據包內。 在接收方,當您使用recvfrom() ,緩沖區將僅包含UDP有效負載,在您的情況下為RTP數據包。

如果您還想檢索其他信息,例如接收到的UDP數據包的源IP或源端口,您也需要執行更多步驟。 例如,對於源IP:

struct sockaddr         src_addr;
socklen_t               src_addr_len;
struct sockaddr_in      *src_addr_in;

/* Receive a UDP packet. Error Checking is omitted */
memset(&src_addr, 0, sizeof(struct sockaddr));
recvfrom(sockfd, buffer, MSG_MAX_LEN, 0, &src_addr, &src_addr_len));

/* Now lets retrieve the IP of the sender */
/* Cast first the sockaddr struct to another more appropriate struct */
src_addr_in = (struct sockaddr_in *) &src_addr;

/* And now use inet_ntoa to print the source IP in a human readable form */
printf("Source IP: %s\n", inet_ntoa(src_addr_in->sin_addr));

您可以通過類似的方式檢索數據包的源端口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM