output_udp.c

来自「this ebook is for GSM if any one has int」· C语言 代码 · 共 75 行

C
75
字号
#include <sys/types.h>#include <sys/socket.h>#include <string.h>#include <stdio.h>#include <stdlib.h>#include <errno.h>#include "getstream.h"#include "simplebuffer.h"#include "output.h"#include "socket.h"#define UDP_MAX_TS	((1500-40)/TS_PACKET_SIZE)int output_init_udp(struct output_s *o) {	o->buffer=sb_init(UDP_MAX_TS, TS_PACKET_SIZE, 0);	if (!o->buffer)		goto errout1;	o->sockfd=socket_open(o->localaddr, 0);	if (o->sockfd < 0)		goto errout2;	socket_set_nonblock(o->sockfd);	if (socket_connect(o->sockfd, o->remoteaddr, o->remoteport))		goto errout3;	/* Join Multicast group if its a multicast destination */	socket_join_multicast(o->sockfd, o->remoteaddr);	/*	 * Set socket TTL - Be warned - I DoSed a Cisco 5500 RSM by sending	 * a 60MBit/s stream in 14 Groups all with TTL of 1 and the switch	 * went to lala land. It seems dropping MCAST traffic is very expensive	 * in IOS 12.1 and its even dropped in Layer 3 instead of Layer 2 although	 * nobody expects ICMP "TTL expired" for MCAST traffic	 */	if (o->ttl)		socket_set_ttl(o->sockfd, o->ttl);	/* We do want to get TSP packets */	o->receiver=1;	return 1;errout3:	socket_close(o->sockfd);errout2:	sb_free(o->buffer);errout1:	return 0;}void output_send_udp(struct output_s *o, uint8_t *tsp) {	int	len;	sb_add_atoms(o->buffer, tsp, 1);	/* check whether another packet would fit ? */	if (!sb_free_atoms(o->buffer)) {		/* Send packet and reset valid counter */		len=send(o->sockfd, sb_bufptr(o->buffer), sb_buflen(o->buffer), MSG_DONTWAIT);		if (len != sb_buflen(o->buffer))			logwrite(LOG_DEBUG, "streamudp: send didnt send all %d of %d byte - %s\n",					len, sb_buflen(o->buffer), strerror(errno));		sb_zap(o->buffer);	}}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?