我正在用ANSI C编写自己的服务器(在Linux上)我在向网络浏览器发送图像时遇到了一个问题()”来发送它,它需要一个char *。所以我正在逐个阅读一个文件(使用fgetc),我使用fread和fgets,但在选角的时候出了点问题(大多数情况下为int)转换为bufor -仍然缺少一些字节(例如2008被发送而不是2020)我认为转换有一些问题,但我使用了sprintf和wchar_t,它仍然不起作用。
我有一个函数:
void send_www(char *buff, int cd){
if(send (cd, buff, strlen(buff), 0) < 0) {
perror ("send()");
exit (1);
我在这里使用:
// while (fread(znak, sizeof(char), i, handler) != 0) {
for (j = 0; j < i; j++) {
a = fgetc(handler);
sprintf(znak, "%ls", a);
send_www(znak, cd);
}
其中i是图像文件的长度,znak是char*(在这个版本中是wchar_t*)。你也可以看到我早期使用fread的尝试。
3条答案
按热度按时间zsohkypk1#
没有更多的细节很难说-你能发布一些代码吗?
一件事是确保你打开图像文件与二进制选项,例如fopen(文件名,“rb”);
如果你只是阅读一个二进制文件并将其发送到另一端需要二进制的套接字,你不需要任何类型转换或sprintf。
你似乎把char类型和字符串搞混了。C字符串是一个以零结尾的字符序列。你的图像文件是一个包含字符序列的二进制文件,但它不是字符串。send()函数接受一个指向字节序列的指针,而不是字符串。为了说明这一点,看看这个字符序列(或字节):
在一些图像文件格式中,这可以是三个RGB像素,因此白色,白色。9字节。可以保存在char缓冲区[9]中。如果调用strlen()在这上面你会得到结果3. strlen()计数,直到看到一个零字符。如果你从一个没有二进制标志的文件中读取这些字节,它可能会被转换,你可能会得到比文件中实际更多或更少的字节(取决于内容、操作系统等)。
粗略的解释代码如下:
要读取二进制文件并将数据发送到套接字,您需要执行类似上面的代码段的操作。您可能会一直阅读,直到到达文件的末尾,代码段只读取一次。此外,在真实的代码中,您应该检查实际发送了多少字节(在send的返回值中),并继续调用send,直到发送完所有数据或发生错误。
0md85ypi2#
您正在使用
strlen()
。strlen()
在达到\0
字节后停止并返回大小。图像和二进制数据允许任何地方的字节值为零,因此strlen()
在这些情况下无用。你需要修改你的函数:
并将图像大小传递给它,这样您就可以安全地使用适当的大小
send()
它。在你的例子中,似乎你确定它是一个
wchar_t
字符串,使用适当的函数,wcslen()
,而不是strlen()
:)kqhtkvqz3#
我猜问题是您的图像数据包含字符(
\0
),所以它们没有被发送,因为您正在使用strlen()
来计算要发送的数据量。