【发布时间】:2011-09-01 16:01:00
【问题描述】:
我想写一个服务器端代码。它应该适用于流行的浏览器和 wget。我的服务器检查文件是否存在,如果存在则浏览器可以下载它。但我有一些问题。 老实说,我读了很多问答(例如:Send binary file in HTTP response using C sockets)但我没有找到。我的浏览器(Chrome)可以获取文本。但我无法发送任何二进制数据或图像等。我正在根据下载文件更改标题。但我还不能发送可下载的文件。
我有一些问题。
void *clientWorker(void * acceptSocket) {
int newSocket = (int) acceptSocket;
char okStatus[] = "HTTP/1.1 200 OK\r\n"
"Content-Type: text/html\r\n"
"Connection: close\r\n"
"Content-Length: 20\r\n"
"\r\n"
"s";
writeLn(newSocket, okStatus);
const char * fileName = "/home/tyra/Desktop/example.txt";
sendF(newSocket, fileName);
}
1- 如果我不在okStatus 中写“s”或其他内容,我的消息将无法发送。我什么都不懂。
这是writeLn函数:
void writeLn(int acceptSocket, const char * buffer) {
int n = write(acceptSocket, buffer, strlen(buffer) - 1);
if (n < 0) {
error("Error while writing");
}
}
这是sendF函数:
string buffer;
string line;
ifstream myfile(fileName);
struct stat filestatus;
stat(fileName, &filestatus);
int fsize = filestatus.st_size;
if (myfile.is_open()) {
while (myfile.good()) {
getline(myfile, line);
buffer.append(line);
}
cout << buffer << endl;
}
writeLn(acceptSocket, buffer.c_str());
cout << fsize << " bytes\n";
有点乱。我还没有使用文件大小。如果我发送一个文件,那么我会重新排列这些东西。
2- 我可以发送文本并且浏览器演示它,但浏览器不理解换行符。 如果文本文件包含 (123\n456\n789),浏览器会显示 (123456789)。我想我应该更改 Content-Type 标头,但我没有发现。
我不希望浏览器演示文本文件。浏览器应该下载它。如何发送可下载的文件?
对不起,我解释的都很复杂。
【问题讨论】:
-
我认为问题之一是
okStatus[]末尾没有零终止字符。尝试将其添加到末尾,而不是 's' -
@Tony The Tiger 感谢您的帮助。我试过了,还是不行。
-
@Tony The Tiger Literal 字符串自动以空值结尾
-
我不知道它是否相关,但
okStatus的Connection: close部分仅后跟\n。后面应该跟\r\n。 -
@Andy,嗯,我不太确定。