首页 > 解决方案 > 服务器无法向客户端发送 ump 消息

问题描述

我目前正在开发 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 虚拟机)上编码的

标签: cudp

解决方案


client_address_len需要初始化为struct传递给的大小sendto()

如果不在 Windows 上,它需要是socklen_tnot类型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

服务器和客户端不说同一种语言。通往灾难的道路。


推荐阅读