【发布时间】:2015-09-23 21:35:56
【问题描述】:
我正在编写 Web 服务器的准系统,但我无法弄清楚为什么我的文件没有通过我的套接字发送,我正在连接它以及它只是不是 send()ing 我的文件...我错过了什么?
//代码 (server.c)
#include<netinet/in.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
int main(void) {
int create_socket, new_socket;
socklen_t addrlen;
int bufsize = 1024;
char *buffer = malloc(bufsize);
struct sockaddr_in address;
if ((create_socket = socket(AF_INET, SOCK_STREAM, 0)) > 0){
printf("The socket was created\n");
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(80);
if (bind(create_socket, (struct sockaddr *) &address, sizeof(address)) == 0){
printf("Binding Socket\n");
}
long fsize;
FILE *fp = fopen("index.html", "r");
fseek(fp, 0, SEEK_END);
fsize = ftell(fp);
rewind(fp);
char *msg = malloc(fsize + 1);
fread(msg, sizeof(msg), 1, fp);
while (1) {
if (listen(create_socket, 10) < 0) {
perror("server: listen");
exit(1);
}
if ((new_socket = accept(create_socket, (struct sockaddr *) &address, &addrlen)) < 0) {
perror("server: accept");
exit(1);
}
if (new_socket > 0){
printf("The Client is connected...\n");
}
recv(new_socket, buffer, bufsize, 0);
printf("%s\n", buffer);
write(new_socket, "HTTP/1.1 200 OK\n", 16);
write(new_socket, "Content-length: 46\n", 19);
write(new_socket, "Content-Type: text/html\n\n", 25);
/* write(new_socket, "<html><body><H1>Hello world</H1></body></html>",46); */
if((send(new_socket, msg, fsize+1, 0)) > 0){
printf("success");
}
else{
printf("failed");
}
close(new_socket);
}
close(create_socket);
return 0;
}
//文件 (index.html) *同一目录
<html>
<body>
<h1>Hello World</h1>
</body>
</html>
【问题讨论】:
-
这个“准系统”服务器有很多问题,这并不好笑。你没有做很好的错误处理。您正在以文本模式而不是二进制模式打开文件。
sizeof(msg)是错误的,请改用fsize(就此而言,我不建议将整个文件读入内存,而是分块读取并发送,否则您以后将无法处理大文件) .您调用listen()的次数太多,请调用一次,而不是循环调用。您没有检查recv()是否失败... -
... 在发送回复之前,您根本没有尝试解析客户端的正确性请求。您必须在回复标题中使用
\r\n而不是\n。您的Content-length标头未指定 实际fsize值(文件是 not 46 字节)。您不确定send()是否成功发送 all 请求的字节。并且发送fsize+1字节是错误的,因为文件只有fsize字节数。并且没有发送Connection: close标头。 -
@JordanDavis 不,你没有。您刚刚添加了成功报告。这段代码实际上没有任何故障处理。
-
@JordanDavis:显然,他没有。由于十几个不同的原因,代码完全错误..
-
@JordanDavis:我刚刚发布了一个示例。