任何人都可以告诉我如何在我的ip/udp
应用程序中通过套接字类型SOCK_DGARM
选项创建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
标题和数据。只有这个发送和回收。
答案 0 :(得分:1)
您可以使用tcpdump
或Wireshark等数据包捕获工具找到它。您无法通过sendto()
函数调用直接访问低级协议详细信息 - 操作系统为您制作标题,通常您不需要查看它们。但是发送端或接收端的数据包捕获将显示标题。
答案 1 :(得分:0)
使用套接字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));
以类似的方式,您可以检索数据包的源端口。