⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 buffer.c

📁 开源的组播程序
💻 C
字号:
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <netinet/in.h>#include <sys/types.h>#include <sys/socket.h>#ifdef DMALLOC#include "dmalloc.h"#endif#include "pmtp.h"int16_t buffer_packet (struct packet_buffer *buffer,		unsigned char *packet, uint16_t length) {	if (buffer->size >= MAX_PACKET_BUFFER_SIZE) {		return -1;	}	if ((buffer->packets[buffer->size] =			(struct packet *) malloc (sizeof (struct packet))) == NULL) {		fprintf (stderr, "Couldn't allocate memory for packet structure.\n");		exit (1);	}	if ((buffer->packets[buffer->size]->packet =			(unsigned char *) malloc (length)) == NULL) {		fprintf (stderr, "Couldn't allocate memory for packet.\n");		exit (1);	}	if (DEBUG & DEBUG_BUFFER_ADD)		fprintf (stderr, "Adding %d'th packet to upload buffer\n",			buffer->size);	memcpy (buffer->packets[buffer->size]->packet, packet,length);	buffer->packets[buffer->size]->length = length;	return MAX_PACKET_BUFFER_SIZE - ++buffer->size;}uint16_t send_buffer (int s, struct sockaddr_in *s_in, 		struct packet_buffer *buffer, uint32_t budget,		uint32_t *packets, uint32_t *bytes_sent) {	uint16_t packet_size;	uint32_t sent = buffer->packets[0]->length;	*packets = *bytes_sent = 0;	while (sent < budget && buffer->size > 0) {		packet_size = buffer->packets[0]->length;		send_packet (s, s_in, buffer->packets[0]->packet, packet_size);		remove_packet(buffer, 0);		packet_size += IP_HEADER_SIZE + UDP_HEADER_SIZE;		sent += packet_size;		if (packets != NULL)			*packets++;		if (bytes_sent != NULL)			*bytes_sent += packet_size;		if (DEBUG & DEBUG_BUFFER_TRANSMIT)			fprintf (stderr, "Bytes sent: %u, packet size: %u, budget: %u.\n",				sent, packet_size, budget);	}	if (buffer->size <= 0)		fprintf (stderr, "Buffer underrun for sending %d bytes.\n",			budget - sent);	return *bytes_sent;}uint16_t remove_packet (struct packet_buffer *buffer, uint16_t position) {	int index;	if (position >= buffer->size) {		fprintf (stderr, "Cant remove packet buffer %d.\n", position);		exit (1);	}	if (buffer->packets[position]->packet == NULL) {		fprintf (stderr, "Packet at position %d doesn't have a payload.\n",			position);		exit (1);	}	if (buffer->packets[position] == NULL) {		fprintf (stderr, "Packet doesn't exist in buffer at position %d.\n",			position);		exit (1);	}	if (DEBUG & DEBUG_BUFFER_REMOVE)		fprintf (stderr, "Removing packet %u with length %u from buffer.\n",			position, buffer->packets[position]->length);		free (buffer->packets[position]->packet);	free (buffer->packets[position]);	for (index = position; index < buffer->size - 1; index++) {		if (buffer->packets[index + 1] == NULL) {			fprintf (stderr, "Null pointer found in packet_buffer array.\n");			exit (1);		}		buffer->packets[index] = buffer->packets[index + 1];	}	buffer->packets[index] = NULL;	return --buffer->size;}void send_packet (int s, struct sockaddr_in *s_in, unsigned char *packet,		uint16_t length) {	if (sendto (s, packet, length, 0, (struct sockaddr *) s_in,			sizeof (struct sockaddr_in)) < 0) {		perror ("sendto");		exit (1);	}}uint16_t init_packet_buffer (struct packet_buffer *buffer) {	if ((buffer->packets = (struct packet **) calloc			(MAX_PACKET_BUFFER_SIZE, sizeof (struct packet *))) == NULL) {		fprintf (stderr, "Couldn't allocate memory for packet buffer.\n");		exit (1);	}	return buffer->size = 0;}uint16_t free_packet_buffer (struct packet_buffer *buffer) {	int index;	int count = 0;	for (index = 0; index < buffer->size; index++) {		remove_packet (buffer, 0);		count++;	}	free (buffer->packets);	return count;}uint16_t buffer_packets_free (struct packet_buffer *buffer) {	int packets_free = MAX_PACKET_BUFFER_SIZE - buffer->size;	return packets_free > 0 ? packets_free : 0;}

⌨️ 快捷键说明

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