[英]sendto() returns values greater than MTU on SOCK_DGRAM (UDP) socket
[英]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.