我目前正在研究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虚拟机)上编码的
答案 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
相同)
服务器和客户端使用不同的语言。通往灾难的道路。