我想编写服务器端代码,它应该能够与流行的浏览器和wget一起使用。我的服务器会检查文件是否存在,如果存在,则浏览器可以下载它。但是我遇到了一些问题。
老实说,我读了很多问题和答案(例如:使用C sockets发送HTTP响应中的二进制文件),但是我没有找到解决方法。我的浏览器(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 LionokStatus
中的Connection: close
部分只跟随一个\n
。它应该跟随\r\n
。 - Andy Johnson