c - 服务器无法向客户端发送 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 虚拟机)上编码的
解决方案
client_address_len
需要初始化为struct
传递给的大小sendto()
。
如果不在 Windows 上,它需要是socklen_t
not类型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
)
服务器和客户端不说同一种语言。通往灾难的道路。
推荐阅读
- testing - 如何测试 3 位总线的第一位是否设置为 1 - verilog
- python - 使用python对7段进行数字识别
- asp.net - .net core HTTP Error 500.19 - Internal Server Error
- python - How do I annotate a type which has an extra attribute with mypy?
- excel - How do I apply Macro/ VBA code in the all worksheets for all workbooks in a folder?
- tkinter - ImageGrab.grab() not cropping screenshot correctly when given coordinates
- multithreading - Perl 线程有时会卡住(其中一些正在等待 futex)
- django - 如何在通道中同步 AsyncWebsocketConsumer 中的函数?
- f# - 无法获取别名字符串类型 F# 的值
- c# - 谷歌日历:“客户端未经授权使用此方法检索访问令牌,或客户端未授权任何请求的范围。”