серверу не удалось отправить сообщение UMP клиенту - PullRequest
0 голосов
/ 20 октября 2018

В настоящее время я работаю над реализацией аудиосервера / клиента 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)

1 Ответ

0 голосов
/ 20 октября 2018

client_address_len необходимо инициализировать в соответствии с размером struct, передаваемым в sendto().

И если не в Windows, он должен иметь тип socklen_t, а не int.

Таким образом, его определение и инициализация будут выглядеть так:

  struct sockaddr_in client_address; 
  socklen_t client_address_len = sizeof client_address;

Еще одна ловушка заключается в том, что сервер отправляет строки:

   ... = sendto(socket_desc, rate, strlen(rate), ...

и клиент (пытаетсяк) получать данные в двоичном виде:

   int * s_rate;
   ...
   s_rate = (int *) malloc(sizeof(int));
   ...
   recvfrom(sockfd, s_rate, ...

(то же самое для s_size и channels)

Сервер и клиент не говорят на одном языке.Путь к катастрофе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...