如何在socket SOCK_DGRAM选项创建时找到ip / udp头

时间:2015-01-12 06:27:23

标签: c voip

任何人都可以告诉我如何在我的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标题和数据。只有这个发送和回收。

2 个答案:

答案 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));

以类似的方式,您可以检索数据包的源端口。