static int udpserver_create(const char* ip, int port) { int ret; socket_t socket; struct sockaddr_in addr; // new a UDP socket socket = socket_udp(); if(socket_error == socket) return 0; // reuse addr socket_setreuseaddr(socket, 1); // bind if(ip && ip[0]) { ret = socket_addr_ipv4(&addr, ip, (unsigned short)port); if(0 == ret) ret = socket_bind(socket, (struct sockaddr*)&addr, sizeof(addr)); } else { ret = socket_bind_any(socket, (unsigned short)port); } if(0 != ret) { socket_close(socket); return 0; } return socket; }
void H264FileSource::RTPPacket(void* param, void *packet, size_t bytes, uint64_t time) { H264FileSource *self = (H264FileSource*)param; assert(self->m_packet == packet); struct sockaddr_in addrin; socket_addr_ipv4(&addrin, self->m_ip.c_str(), self->m_port[0]); int r = socket_sendto(self->m_socket[0], packet, bytes, 0, (struct sockaddr*)&addrin, sizeof(addrin)); assert(r == (int)bytes); rtp_onsend(self->m_rtp, packet, bytes, time); }
int H264FileSource::SendRTCP() { // make sure have sent RTP packet time64_t clock = time64_now(); int interval = rtp_rtcp_interval(m_rtp); if(0 == m_rtcp_clock || m_rtcp_clock + interval < clock) { char rtcp[1024] = {0}; size_t n = rtp_rtcp_report(m_rtp, rtcp, sizeof(rtcp)); // send RTCP packet struct sockaddr_in addrin; socket_addr_ipv4(&addrin, m_ip.c_str(), m_port[1]); socket_sendto(m_socket[1], rtcp, n, 0, (struct sockaddr*)&addrin, sizeof(addrin)); m_rtcp_clock = clock; } return 0; }