В настоящее время я работаю над реализацией аудиосервера / клиента UDP, где сервер получает имя файла от клиента и отправляет данные аудиофайла в ответ.Сервер получает имя файла, открывает его и получает всю необходимую информацию, но не может отправить клиенту. Мне не удалось выяснить, что с ним не так, поэтому я был бы признателен за любые предложения по решению этой проблемы.
Клиент:
len = sendto(sockfd, filename, strlen(filename), 0, (struct
sockaddr*)&server_address,sizeof(server_address));
//Sends the filename to server successfully
if(len < 0){
printf("could not send filename\n");
return 1;
}
printf("1\n");
recvfrom(sockfd, s_rate, 1024, 0, NULL, NULL);
recvfrom(sockfd, s_size, 1024, 0, NULL, NULL);
recvfrom(sockfd, channels, 1024, 0, NULL, NULL);
recvfrom(sockfd, content, 1024, 0, NULL, NULL);
printf("2\n");
//Waits for information about audiofile from server
Сервер:
read_size = recvfrom(socket_desc, file_name,
1024, 0, (struct sockaddr *) &client_address,
&client_address_len);
//Receives filename successfully from client. Opens the
file gets information from it and then attempts to send
the information as a string:
sprintf(rate, "%d", ra);
sprintf(size, "%d", s);
sprintf(ch, "%d", c);
printf("rate: %s, size: %s, ch: %s\n", rate, size, ch);
int err = sendto(socket_desc, rate, strlen(rate), 0, (struct
sockaddr *) &client_address,
sizeof(client_address));
if(err < 0){
printf("could not send rate\n");
}
err = sendto(socket_desc, size, strlen(size), 0, (struct
sockaddr *) &client_address,
sizeof(client_address));
if(err < 0){
printf("could not send size\n");
}
err = sendto(socket_desc, ch, strlen(ch), 0, (struct
sockaddr *) &client_address,
sizeof(client_address));
if(err < 0){
printf("could not send channels\n");
Надеюсь, этой информации достаточно.Редактирование: функция recvfrom останавливает программу до тех пор, пока она не получит пакет, а функция sendto вернет -1 в случае ошибки.Вот некоторый код для сервера, который показывает, как он создает и привязывает сокет:
int socket_desc, read_size, client_address_len, audio; int
*s_rate, *s_size, *channels; struct sockaddr_in server;
struct sockaddr_in client_address; char file_name[1024];
char content[1024], rate[1024], size[1024], ch[1024]; //
malloc(sizeof(int), 1) // free(s_rate) s_rate = (int *)
malloc(sizeof(int)); s_size = (int *) malloc(sizeof(int));
channels = (int *) malloc(sizeof(int)); socket_desc =
socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(socket_desc < 0){ printf("error creating socket\n");
return 1; } – Omri Ram 6 mins ago delete
server.sin_family = AF_INET; server.sin_port =
htons(2018); server.sin_addr.s_addr =
htonl(INADDR_ANY); if(bind(socket_desc, (struct
sockaddr * )&server, sizeof(server)) < 0){ printf("error
binding socket \n"); return 1; }
Это кодировано в Ubuntu (виртуальная машина Linux)