c - 通过C中的套接字发送mp3文件

标签 c sockets audio tcp mp3

我在尝试通过套接字发送 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)保存到文件中,它会很好地工作,但是当我尝试将其保存在服务器端时,它会得到已损坏。另外,缓冲区的内容是这个??$?

我不知道为什么,我认为这是因为它是一个二进制文件。

有什么想法吗?也许我以错误的方式发送数据?

提前致谢

最佳答案

这是一个二进制文件,意味着包含'\0'的字节是合法数据。

这一行:

fileLen = ftell(file);

告诉您要发送多少字节。

此外,send() 返回 ssize_t,而不是 int。根据 man page :

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

更好的是,使用 sendfile() 直接发送文件:

struct stat sb;
int fd = open( "AAAA.mp3", O_RDONLY );
fstat( fd, &sb );
// first send the file size - NB this is not correct as it
// assumes sizeof( sb.st_size ) is the same on the other 
// end *and* has the same endianness
write( sockfd, &sb.st_size, sizeof( sb.st_size ) );
ssize_t bytesSent = sendfile( sockfd, fd, NULL, sb.st_size );

关于c - 通过C中的套接字发送mp3文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30582473/

相关文章:

c++ - 指向单个位的 C/C++ 指针类型?

使用clamav扫描php文件上传,权限在/tmp/

cocoa - 在 Mac 上录制音频

c++ - main 函数已在 ocaml asmrun 库中定义

c - Mac OS X 中的 getopt

c# - 为什么我的表单在调用 BeginConnect 时卡住?

运行时的 Java Carbon 组件警告 - OS X

Unix 音频系统 API

android - 使用 O_DIRECT 打开文件时写入错误 : Invalid argument,

Java,使用套接字: is it necessary use bufferedinputstream and bufferedoutputstream?发送和接收文件