服务器无法向客户端发送 ump 消息
server not managing to send ump message to client
我目前正在研究 UDP 音频 server/client 实现,其中服务器从客户端接收文件名并发送音频文件的详细信息作为响应。服务器接收文件名并打开它并获取所有必要的信息,但无法发送给客户端我没能弄清楚它出了什么问题所以我很感激处理这个问题的任何建议。
客户:
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 函数 returns -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
需要初始化为传递给 sendto()
的 struct
的大小。
如果不在 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
相同)
服务器和客户端说的不是同一种语言。通往灾难的道路。
我目前正在研究 UDP 音频 server/client 实现,其中服务器从客户端接收文件名并发送音频文件的详细信息作为响应。服务器接收文件名并打开它并获取所有必要的信息,但无法发送给客户端我没能弄清楚它出了什么问题所以我很感激处理这个问题的任何建议。
客户:
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 函数 returns -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
需要初始化为传递给 sendto()
的 struct
的大小。
如果不在 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
相同)
服务器和客户端说的不是同一种语言。通往灾难的道路。