Я пишу barebones веб-сервера, но я не могу понять, почему мой файл не отправляется через мой сокет, я подключаюсь к нему и всему, что он просто не send()
В моем файле ... Что мне не хватает?Отправка файла через сокет TCP/IP (веб-сервер)
// КОД (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;
}
// FILE (index.html) * тот же каталог
<html>
<body>
<h1>Hello World</h1>
</body>
</html>
Откуда вы знаете, что его не отправляют? – Amit
его даже не отправляет ответ в браузере ... –
С этим «баребонным» сервером так много чего не так, это не смешно. Вы не очень хорошо справляетесь с ошибками. Вы открываете файл в текстовом режиме вместо двоичного режима. 'sizeof (msg)' is wrong, вместо этого используйте 'fsize' (в любом случае, я бы не советовал полностью читать весь файл в памяти, читать и отправлять его в куски, иначе вы не сможете обрабатывать большие файлы позже). Вы вызываете 'listen()' слишком много раз, назовите его один раз, а не в цикле. Вы не проверяете, если 'recv()' failed ... –