【发布时间】:2015-06-01 20:15:53
【问题描述】:
我在尝试通过套接字发送 mp3 文件时遇到问题
这是我用来读取 mp3 文件的代码
FILE *file;
char *audio;
unsigned long fileLen;
file = fopen("AAAA.mp3", "rb");
if (!file)
{
fprintf(stderr, "Unable to open file");
return;
}
fseek(file, 0, SEEK_END);
fileLen = ftell(file);
fseek(file, 0, SEEK_SET);
audio = (char *)malloc(fileLen+1);
if (!audio)
{
fprintf(stderr, "Memory error!");
fclose(file);
return;
}
fread(audio, fileLen, 1, file);
fclose(file);
然后我有这个功能来发送内容
int send_message(int sockfd, uint16_t code, char *message)
{
int bytes_sent;
uint16_t l_msg;
uint16_t l_msg_net;
char buffer[BUFFER_SIZE+CODE_LEN+MSG_LEN];
l_msg = strlen(message) + 1;
l_msg_net = htons(l_msg);
code = htons(code);
// Save message code
memcpy(buffer, &code, CODE_LEN);
// Save message length
memcpy(buffer + CODE_LEN, &l_msg_net, MSG_LEN);
// Save message
memcpy(buffer + CODE_LEN + MSG_LEN, message, l_msg);
bytes_sent = send(sockfd, buffer, (l_msg + CODE_LEN + MSG_LEN), 0);
return(bytes_sent);
}
如果我在发送之前将缓冲区(第一段代码中的audio var)保存到文件中,效果很好,但是当我尝试将其保存在服务器端时,它会损坏。还有,缓冲区的内容是这个??$?
不知道为什么,我想是因为是二进制文件。
有什么想法吗?也许我以错误的方式发送数据?
提前致谢
【问题讨论】:
-
嗯,它里面有strlen(),所以它不是很好。使用 strlen() 调用的所有网络/套接字代码中有 99% 是 borken。
-
@MartinJames 100% 假设二进制流。
-
我用 sizeof(message) 试过了,但结果是一样的...
-
你真的应该阅读一些文档。真的。
sizeof指针是指针的大小。