Я хочу использовать API sendto () для отправки видео и аудио данных через пакет UDP.Размер буфера отправки, который я получил с помощью getsockopt (), равен 114688, однако sendto () вернул -1, когда пакет данных меньше 65536, а не 114688. И сообщение об ошибке слишком длинное.
Когда я использовал setsockopt(), чтобы настроить размер буфера отправки как 200000, я использовал getsockopt () и обнаружил, что размер буфера отправки был не 200000, а 262142. Таким образом, я все еще получал ту же ошибку, когда отправлял пакет данных с размером больше 65536.
Я запутался в этой ситуации.Я хочу знать, в чем причина и как решить эту проблему.
Когда я использовал библиотеку FFMPEG для отправки видео и аудио пакета, ошибки не было.Поэтому я уверен, что есть решение этой проблемы, и я что-то упустил.
Кто-нибудь может мне помочь с этой проблемой?Я действительно не могу понять, в чем причина.
Используемая мной ОС - это Ubuntu 11.04, я получил те же результаты в Ubuntu 11.10.
Это код, который я использовал для создания сокета и настройкипараметр:
unsigned char *output_buffer = (unsigned char*)av_malloc(IO_BUFFER_SIZE);
if (NULL == output_buffer) {
printf("Couldn't allocate input buffer.\n");
return NULL;
}
output_context_data_t *context_data = (output_context_data_t *)malloc(sizeof(output_context_data_t));
if (NULL == context_data) {
printf("Could not allocate output context data.\n");
av_free(output_buffer);
return NULL;
}
context_data->socket = socket(AF_INET, SOCK_DGRAM, 0);
if(context_data->socket < 0) {
printf("socket creating fail!\n");
return NULL;
}
context_data->socket_addr->sin_family = AF_INET;
context_data->socket_addr->sin_port = htons(output_port);
ret = inet_pton(AF_INET, output_ip, &(context_data->socket_addr->sin_addr));
if(0 == ret) {
printf("inet_pton fail!\n");
return NULL;
}
ret = setsockopt(context_data->socket, IPPROTO_IP, IP_MULTICAST_TTL,
&option_ttl, sizeof(int));
if(ret < 0) {
printf("ttl configuration fail!\n");
return NULL;
}
ret = setsockopt(context_data->socket, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(int));
if(ret < 0) {
printf("resue configuration fail!\n");
return NULL;
}
Это код для отправки пакета UDP:
int send_size = sendto(context_data->socket, buf, buf_size, 0,
(struct sockaddr *)context_data->socket_addr, sizeof(*context_data->socket_addr)));
//the video or audio data is in buf and its size is buf_size.
Это код, который я использовал для получения размера буфера отправки:
int bufsize;
int size = sizeof(bufsize);
getsockopt(context_data->socket,SOL_SOCKET, SO_SNDBUF, &bufsize, &size);
Это код, который я использовал для настройки размера буфера отправки:
tmp = 200000;
ret = setsockopt(context_data->socket, SOL_SOCKET, SO_SNDBUF, &tmp, sizeof(tmp));
if(ret < 0) {
printf("sending buffer size configuration fail!\n");
return NULL;
}