服务器未设法将ump消息发送给客户端

时间:2018-10-20 12:12:27

标签: c udp

我目前正在研究UDP音频服务器/客户端实现,其中服务器从客户端接收文件名并作为响应发送音频文件的详细信息。服务器接收文件名并打开它并获取所有必要的信息,但是由于无法发送给客户端,所以我无法弄清楚它出了什么问题,因此,我希望能找到处理该问题的各种建议。

客户:

users

服务器:

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

我希望这是足够的信息。 编辑: recvfrom函数将停止程序,直到接收到程序包为止,并且sendto函数在出错时返回-1。以下是一些服务器代码,显示了如何创建和绑定套接字:

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");

这是在Ubuntu(Linux虚拟机)上编码的

1 个答案:

答案 0 :(得分:1)

client_address_len需要初始化为传递到struct的{​​{1}}的大小。

如果不在Windows上,则其类型必须为sendto(),而不是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相同)

服务器和客户端使用不同的语言。通往灾难的道路。