亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? net_udp.c

?? 視頻音頻編碼程序 視頻音頻編碼程序 視頻音頻編碼程序
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
		debug_msg("Not yet implemented\n");
		abort();
	}

	if (inet_pton(AF_INET6, addr, &s->addr6) != 1) {
		/* We should probably try to do a DNS lookup on the name */
		/* here, but I'm trying to get the basics going first... */
		debug_msg("IPv6 address conversion failed\n");
                free(s);
		return NULL;	
	}
	s->fd = socket(AF_INET6, SOCK_DGRAM, 0);
	if (s->fd < 0) {
		socket_error("socket");
		return NULL;
	}
	if (SETSOCKOPT(s->fd, SOL_SOCKET, SO_REUSEADDR, (char *) &reuse, sizeof(reuse)) != 0) {
		socket_error("setsockopt SO_REUSEADDR");
		return NULL;
	}
#ifdef SO_REUSEPORT
	if (SETSOCKOPT(s->fd, SOL_SOCKET, SO_REUSEPORT, (char *) &reuse, sizeof(reuse)) != 0) {
		socket_error("setsockopt SO_REUSEPORT");
		return NULL;
	}
#endif
	
	memset((char *)&s_in, 0, sizeof(s_in));
	s_in.sin6_family = AF_INET6;
	s_in.sin6_port   = htons(rx_port);
#ifdef HAVE_SIN6_LEN
	s_in.sin6_len    = sizeof(s_in);
#endif
	s_in.sin6_addr = in6addr_any;
	if (bind(s->fd, (struct sockaddr *) &s_in, sizeof(s_in)) != 0) {
		socket_error("bind");
		return NULL;
	}
	
	if (IN6_IS_ADDR_MULTICAST(&(s->addr6))) {
		unsigned int      loop = 1;
		struct ipv6_mreq  imr;
#ifdef MUSICA_IPV6
		imr.i6mr_interface = 1;
		imr.i6mr_multiaddr = s->addr6;
#else
		imr.ipv6mr_multiaddr = s->addr6;
		imr.ipv6mr_interface = 0;
#endif
		
		if (SETSOCKOPT(s->fd, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, (char *) &imr, sizeof(struct ipv6_mreq)) != 0) {
			socket_error("setsockopt IPV6_ADD_MEMBERSHIP");
			return NULL;
		}
		
		if (SETSOCKOPT(s->fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, (char *) &loop, sizeof(loop)) != 0) {
			socket_error("setsockopt IPV6_MULTICAST_LOOP");
			return NULL;
		}
		if (SETSOCKOPT(s->fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, (char *) &ttl, sizeof(ttl)) != 0) {
			socket_error("setsockopt IPV6_MULTICAST_HOPS");
			return NULL;
		}
	}

	ASSERT(s != NULL);

        s->addr = strdup(addr);
	return s;
#else
	UNUSED(addr);
	UNUSED(iface);
	UNUSED(rx_port);
	UNUSED(tx_port);
	UNUSED(ttl);
	return NULL;
#endif
}

static void udp_exit6(socket_udp *s)
{
#ifdef HAVE_IPv6
	if (IN6_IS_ADDR_MULTICAST(&(s->addr6))) {
		struct ipv6_mreq  imr;
#ifdef MUSICA_IPV6
		imr.i6mr_interface = 1;
		imr.i6mr_multiaddr = s->addr6;
#else
		imr.ipv6mr_multiaddr = s->addr6;
		imr.ipv6mr_interface = 0;
#endif
		
		if (SETSOCKOPT(s->fd, IPPROTO_IPV6, IPV6_DROP_MEMBERSHIP, (char *) &imr, sizeof(struct ipv6_mreq)) != 0) {
			socket_error("setsockopt IPV6_DROP_MEMBERSHIP");
			abort();
		}
	}
	close(s->fd);
        free(s->addr);
	free(s);
#else
	UNUSED(s);
#endif  /* HAVE_IPv6 */
}

static int udp_send6(socket_udp *s, uint8_t *buffer, int buflen)
{
#ifdef HAVE_IPv6
	struct sockaddr_in6	s_in;
	
	ASSERT(s != NULL);
	ASSERT(s->mode == IPv6);
	ASSERT(buffer != NULL);
	ASSERT(buflen > 0);
	
	memset((char *)&s_in, 0, sizeof(s_in));
	s_in.sin6_family = AF_INET6;
	s_in.sin6_addr   = s->addr6;
	s_in.sin6_port   = htons(s->tx_port);
#ifdef HAVE_SIN6_LEN
	s_in.sin6_len    = sizeof(s_in);
#endif
	return sendto(s->fd, buffer, buflen, 0, (struct sockaddr *) &s_in, sizeof(s_in));
#else
	UNUSED(s);
	UNUSED(buffer);
	UNUSED(buflen);
	return -1;
#endif
}

#ifndef _WIN32
static int udp_send_iov6(socket_udp *s, struct iovec *iov, int count)
{
#ifdef HAVE_IPv6
	struct sockaddr_in6	s_in;
	struct msghdr msg;
	
	ASSERT(s != NULL);
	ASSERT(s->mode == IPv6);
	
	memset((char *)&s_in, 0, sizeof(s_in));
	s_in.sin6_family = AF_INET6;
	s_in.sin6_addr   = s->addr6;
	s_in.sin6_port   = htons(s->tx_port);
#ifdef HAVE_SIN6_LEN
	s_in.sin6_len    = sizeof(s_in);
#endif

	msg.msg_name 		 = &s_in;
	msg.msg_namelen 	 = sizeof(s_in);
	msg.msg_iov 		 = iov;
	msg.msg_iovlen 		 = count;
	msg.msg_control 	 = NULL;
	msg.msg_controllen 	 = 0;
	msg.msg_flags 		 = 0;

	return sendmsg(s->fd, &msg, 0);
#else
	UNUSED(s);
	UNUSED(iov);
	UNUSED(count);
	return -1;
#endif
}
#endif

static char *udp_host_addr6(socket_udp *s)
{
#ifdef HAVE_IPv6
	char		 hname[MAXHOSTNAMELEN];
	int 			 gai_err, newsock;
	struct addrinfo 	 hints, *ai;
	struct sockaddr_in6 	 local, addr6;
	int len = sizeof(local), result = 0;

	newsock=socket(AF_INET6, SOCK_DGRAM,0);
    memset ((char *)&addr6, 0, len);
    addr6.sin6_family = AF_INET6;
#ifdef HAVE_SIN6_LEN
    addr6.sin6_len    = len;
#endif
    bind (newsock, (struct sockaddr *) &addr6, len);
    addr6.sin6_addr = s->addr6;
    addr6.sin6_port = htons (s->rx_port);
    connect (newsock, (struct sockaddr *) &addr6, len);

    memset ((char *)&local, 0, len);
	if ((result = getsockname(newsock,(struct sockaddr *)&local, &len)) < 0){
		local.sin6_addr = in6addr_any;
		local.sin6_port = 0;
		debug_msg("getsockname failed\n");
	}

	close (newsock);

	if (IN6_IS_ADDR_UNSPECIFIED(&local.sin6_addr) || IN6_IS_ADDR_MULTICAST(&local.sin6_addr)) {
		if (gethostname(hname, MAXHOSTNAMELEN) != 0) {
			debug_msg("gethostname failed\n");
			abort();
		}
		
		hints.ai_protocol  = 0;
		hints.ai_flags     = 0;
		hints.ai_family    = AF_INET6;
		hints.ai_socktype  = SOCK_DGRAM;
		hints.ai_addrlen   = 0;
		hints.ai_canonname = NULL;
		hints.ai_addr      = NULL;
		hints.ai_next      = NULL;

		if ((gai_err = getaddrinfo(hname, NULL, &hints, &ai))) {
			debug_msg("getaddrinfo: %s: %s\n", hname, gai_strerror(gai_err));
			abort();
		}
		
		if (inet_ntop(AF_INET6, &(((struct sockaddr_in6 *)(ai->ai_addr))->sin6_addr), hname, MAXHOSTNAMELEN) == NULL) {
			debug_msg("inet_ntop: %s: \n", hname);
			abort();
		}
		freeaddrinfo(ai);
		return xstrdup(hname);
	}
	if (inet_ntop(AF_INET6, &local.sin6_addr, hname, MAXHOSTNAMELEN) == NULL) {
		debug_msg("inet_ntop: %s: \n", hname);
		abort();
	}
	return xstrdup(hname);
#else  /* HAVE_IPv6 */
	UNUSED(s);
	return xstrdup("::");	/* The unspecified address... */
#endif /* HAVE_IPv6 */
}
	
/*****************************************************************************/
/* Generic functions, which call the appropriate protocol specific routines. */
/*****************************************************************************/

/**
 * udp_addr_valid:
 * @addr: string representation of IPv4 or IPv6 network address.
 *
 * Returns TRUE if @addr is valid, FALSE otherwise.
 **/

int udp_addr_valid(const char *addr)
{
        return udp_addr_valid4(addr) | udp_addr_valid6(addr);
}

/**
 * udp_init:
 * @addr: character string containing an IPv4 or IPv6 network address.
 * @rx_port: receive port.
 * @tx_port: transmit port.
 * @ttl: time-to-live value for transmitted packets.
 *
 * Creates a session for sending and receiving UDP datagrams over IP
 * networks. 
 *
 * Returns: a pointer to a valid socket_udp structure on success, NULL otherwise.
 **/
socket_udp *udp_init(const char *addr, uint16_t rx_port, uint16_t tx_port, int ttl)
{
	return udp_init_if(addr, NULL, rx_port, tx_port, ttl);
}

/**
 * udp_init_if:
 * @addr: character string containing an IPv4 or IPv6 network address.
 * @iface: character string containing an interface name.
 * @rx_port: receive port.
 * @tx_port: transmit port.
 * @ttl: time-to-live value for transmitted packets.
 *
 * Creates a session for sending and receiving UDP datagrams over IP
 * networks.  The session uses @iface as the interface to send and
 * receive datagrams on.
 * 
 * Return value: a pointer to a socket_udp structure on success, NULL otherwise.
 **/
socket_udp *udp_init_if(const char *addr, const char *iface, uint16_t rx_port, uint16_t tx_port, int ttl)
{
	socket_udp *res;
	
	if (strchr(addr, ':') == NULL) {
		res = udp_init4(addr, iface, rx_port, tx_port, ttl);
	} else {
		res = udp_init6(addr, iface, rx_port, tx_port, ttl);
	}
	return res;
}

/**
 * udp_exit:
 * @s: UDP session to be terminated.
 *
 * Closes UDP session.
 * 
 **/
void udp_exit(socket_udp *s)
{
    switch(s->mode) {
    case IPv4 : udp_exit4(s); break;
    case IPv6 : udp_exit6(s); break;
    default   : abort();
    }
}

/**
 * udp_send:
 * @s: UDP session.
 * @buffer: pointer to buffer to be transmitted.
 * @buflen: length of @buffer.
 * 
 * Transmits a UDP datagram containing data from @buffer.
 * 
 * Return value: 0 on success, -1 on failure.
 **/
int udp_send(socket_udp *s, uint8_t *buffer, int buflen)
{
	switch (s->mode) {
	case IPv4 : return udp_send4(s, buffer, buflen);
	case IPv6 : return udp_send6(s, buffer, buflen);
	default   : abort(); /* Yuk! */
	}
	return -1;
}

#ifndef _WIN32
int udp_send_iov(socket_udp *s, struct iovec *iov, int count)
{
	switch (s->mode) {
	case IPv4 : return udp_send_iov4(s, iov, count);
	case IPv6 : return udp_send_iov6(s, iov, count);
	default   : abort();
	}
	return -1;
}
#endif

/**
 * udp_recv:
 * @s: UDP session.
 * @buffer: buffer to read data into.
 * @buflen: length of @buffer.
 * 
 * Reads from datagram queue associated with UDP session.
 *
 * Return value: number of bytes read, returns 0 if no data is available.
 **/
int udp_recv(socket_udp *s, uint8_t *buffer, int buflen)
{
	/* Reads data into the buffer, returning the number of bytes read.   */
	/* If no data is available, this returns the value zero immediately. */
	/* Note: since we don't care about the source address of the packet  */
	/* we receive, this function becomes protocol independent.           */
	int		len;

	ASSERT(buffer != NULL);
	ASSERT(buflen > 0);

	len = recvfrom(s->fd, buffer, buflen, 0, 0, 0);
	if (len > 0) {
		return len;
	}
	if (errno != ECONNREFUSED) {
		socket_error("recvfrom");
	}
	return 0;
}

static fd_set	rfd;
static fd_t	max_fd;

/**
 * udp_fd_zero:
 * 
 * Clears file descriptor from set associated with UDP sessions (see select(2)).
 * 
 **/
void udp_fd_zero(void)
{
	FD_ZERO(&rfd);
	max_fd = 0;
}

/**
 * udp_fd_set:
 * @s: UDP session.
 * 
 * Adds file descriptor associated of @s to set associated with UDP sessions.
 **/
void udp_fd_set(socket_udp *s)
{
	FD_SET(s->fd, &rfd);
	if (s->fd > (fd_t)max_fd) {
		max_fd = s->fd;
	}
}

/**
 * udp_fd_isset:
 * @s: UDP session.
 * 
 * Checks if file descriptor associated with UDP session is ready for
 * reading.  This function should be called after udp_select().
 *
 * Returns: non-zero if set, zero otherwise.
 **/
int udp_fd_isset(socket_udp *s)
{
	return FD_ISSET(s->fd, &rfd);
}

/**
 * udp_select:
 * @timeout: maximum period to wait for data to arrive.
 * 
 * Waits for data to arrive for UDP sessions.
 * 
 * Return value: number of UDP sessions ready for reading.
 **/
int udp_select(struct timeval *timeout)
{
	return select(max_fd + 1, &rfd, NULL, NULL, timeout);
}

/**
 * udp_host_addr:
 * @s: UDP session.
 * 
 * Return value: character string containing network address
 * associated with session @s.
 **/
char *udp_host_addr(socket_udp *s)
{
  if (s && s->mode == IPv6) {
    return udp_host_addr6(s);
  } 
  return udp_host_addr4();
}

/**
 * udp_fd:
 * @s: UDP session.
 * 
 * This function allows applications to apply their own socketopt()'s
 * and ioctl()'s to the UDP session.
 * 
 * Return value: file descriptor of socket used by session @s.
 **/
int udp_fd(socket_udp *s)
{
	if (s && s->fd > 0) {
		return s->fd;
	} 
	return 0;
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品国产1区二区| 日韩精品一区二区三区在线| 日韩精品乱码免费| 国产午夜精品一区二区三区视频 | 精品三级在线看| 色综合久久综合中文综合网| 麻豆91免费看| 亚洲在线观看免费| 国产精品第13页| 久久久久久麻豆| 欧美一三区三区四区免费在线看| a在线欧美一区| 国产麻豆精品theporn| 视频在线在亚洲| 亚洲综合无码一区二区| 国产精品久久三区| 欧美国产综合色视频| 欧美变态口味重另类| 91.com视频| 欧美在线免费视屏| 91麻豆视频网站| 97久久超碰国产精品| 成人综合激情网| 国产精品一区二区在线观看不卡| 免费精品视频在线| 丝袜亚洲精品中文字幕一区| 亚洲国产综合人成综合网站| 亚洲欧美欧美一区二区三区| 九九国产精品视频| 麻豆91在线看| 另类小说一区二区三区| 秋霞影院一区二区| 奇米777欧美一区二区| 日韩精品国产精品| 午夜久久电影网| 午夜影院久久久| 亚洲五码中文字幕| 亚洲国产精品嫩草影院| 亚洲va欧美va人人爽| 亚洲不卡av一区二区三区| 亚洲成人自拍一区| 亚洲成人高清在线| 五月天中文字幕一区二区| 婷婷丁香久久五月婷婷| 三级不卡在线观看| 日本vs亚洲vs韩国一区三区| 蜜臀99久久精品久久久久久软件| 美女久久久精品| 极品少妇一区二区三区精品视频 | 亚洲色图欧美在线| 久久久精品国产免费观看同学| 国产精品77777竹菊影视小说| 国产一区二区三区电影在线观看| 国模大尺度一区二区三区| 国产精品99久久久久久似苏梦涵 | 中文字幕一区二区视频| 亚洲视频图片小说| 亚洲国产裸拍裸体视频在线观看乱了| 亚洲一区二区三区四区五区黄| 午夜视频一区二区| 久久国产日韩欧美精品| 国产盗摄女厕一区二区三区| av不卡免费在线观看| 欧美系列亚洲系列| 精品国产免费一区二区三区香蕉| 国产日韩欧美亚洲| 专区另类欧美日韩| 日本va欧美va瓶| 成人h动漫精品一区二| 欧美视频一区二区| 久久亚洲精华国产精华液 | 一区二区三区中文字幕在线观看| 天天影视网天天综合色在线播放| 乱中年女人伦av一区二区| 国产suv精品一区二区6| 欧美亚洲国产怡红院影院| 日韩欧美国产午夜精品| 国产精品久久久久aaaa| 五月婷婷久久综合| 丁香婷婷综合激情五月色| 欧美日韩国产高清一区二区三区| 欧美精品一区二区三区蜜桃视频 | 久久久精品日韩欧美| 亚洲精品高清视频在线观看| 久久精品二区亚洲w码| 色综合久久中文字幕| 日韩欧美www| 一区二区三区在线视频播放| 狠狠狠色丁香婷婷综合激情| 欧美最新大片在线看| 久久综合九色综合97_久久久| 亚洲免费在线观看视频| 韩国一区二区在线观看| 欧美三级电影在线观看| 国产视频一区在线观看| 日本不卡1234视频| 日本久久精品电影| 久久精品水蜜桃av综合天堂| 天堂久久一区二区三区| 99精品国产热久久91蜜凸| 日韩一区二区麻豆国产| 一二三四社区欧美黄| 高清日韩电视剧大全免费| 日韩欧美中文一区| 亚洲一区二区影院| 97精品超碰一区二区三区| 欧美电影精品一区二区| 亚洲va欧美va人人爽| 中文字幕va一区二区三区| 亚洲成人自拍一区| 色综合久久久久| 国产精品久久久久久久久图文区| 韩国精品一区二区| 日韩一级大片在线| 午夜精品久久久久久久99水蜜桃 | 婷婷久久综合九色综合伊人色| 北岛玲一区二区三区四区| 久久综合九色综合97_久久久| 免费精品视频在线| 91精品国产综合久久久久久久| 一区二区三区日韩精品视频| 一本色道久久综合亚洲91| 国产精品卡一卡二| 高清视频一区二区| 国产欧美日韩精品在线| 国产精品亚洲成人| 欧美va亚洲va| 久久99久久久欧美国产| 欧美r级在线观看| 韩国欧美国产1区| 日韩欧美精品在线视频| 蜜臀久久99精品久久久画质超高清| 欧美日韩在线综合| 日韩精品成人一区二区在线| 欧美精品tushy高清| 视频一区二区国产| 51精品国自产在线| 裸体健美xxxx欧美裸体表演| 日韩欧美美女一区二区三区| 精品一区二区三区在线视频| 精品福利在线导航| 国产精品一区二区果冻传媒| 日本一区二区三区电影| 本田岬高潮一区二区三区| 亚洲欧美偷拍三级| 欧美日韩免费观看一区二区三区| 亚洲国产精品视频| 日韩免费视频一区| 国产精品一区二区不卡| 国产精品不卡在线| 在线影视一区二区三区| 亚洲成人av一区| 欧美一级二级三级蜜桃| 国产一区日韩二区欧美三区| 欧美国产禁国产网站cc| 91丝袜呻吟高潮美腿白嫩在线观看| 亚洲欧美日本韩国| 欧洲国内综合视频| 亚洲精品免费一二三区| 国产乱码精品1区2区3区| 日韩网站在线看片你懂的| 狠狠久久亚洲欧美| 国产精品三级av| 色琪琪一区二区三区亚洲区| 亚洲国产欧美日韩另类综合 | 国产成人午夜99999| 亚洲一区视频在线| 亚洲激情在线播放| 精品久久久久香蕉网| 国模无码大尺度一区二区三区| 日韩午夜在线观看| 91看片淫黄大片一级在线观看| 久久黄色级2电影| 亚洲精品视频在线看| 久久九九国产精品| 欧美二区三区91| 91同城在线观看| 成人一级黄色片| 久久成人免费电影| 亚洲成人激情自拍| 亚洲欧洲日本在线| 久久久91精品国产一区二区三区| 51精品秘密在线观看| 一本大道久久a久久精二百| 国产乱码精品1区2区3区| 免费观看日韩电影| 亚洲成av人片在线| 亚洲在线视频一区| 亚洲色图色小说| 国产精品成人免费| 视频在线观看91| 亚洲aaa精品| 亚洲欧美日韩中文播放 | 一区二区在线电影| 中文字幕高清不卡| 国产欧美日韩另类视频免费观看| 日韩精品一区二| 欧美一区二区三区精品| 欧美老肥妇做.爰bbww| 91福利精品视频|