BEGINNER c++ programmer help please | Newbie | | Join Date: Jun 2009
Posts: 8
| |
hi
this is my code -
#include <sys/types.h>
-
#include <sys/socket.h>
-
#include <netdb.h>
-
#include <stdlib.h>
-
#include <string.h>
-
#include <iostream>
-
#include <fcntl.h>
-
using namespace std;
-
extern int makeserversocket(const char *);
-
-
const char *notimp="HTTP/1.0 501 Method Not Implemented\r\n"
-
"Server: Work-in-Progress\r\n"
-
"Content-Length: 61\r\n"
-
"Connection: close\r\n"
-
"Content-Type: text/html\r\n"
-
"\r\n"
-
"<h1>Method Not Implemented</h1>\r\n"
-
"Invalid method in request.\r\n";
-
-
const char *notfound="HTTP/1.0 404 Not Found\r\n"
-
"Server: Work-in-Progress\r\n"
-
"Content-Length: 25\r\n"
-
"Connection: close\r\n"
-
"Content-Type: text/html\r\n"
-
"\r\n"
-
"<h1>file not found</h1>\r\n";
-
-
const char *ok1="HTTP/1.0 200 OK\r\n"
-
"Server: Work-in-Progress\r\n"
-
"Connection: close\r\n";
-
-
int main(int argc, char *argv[]){
-
int ssock, connsock, rc, pid, n, fd;
-
char buf[2048], fbuf[512], cmd[16], uri[256], proto[16];
-
char *filename;
-
-
if(argc != 2) { cerr << "usage: server port\n"; exit(1); }
-
ssock=makeserversocket(argv[1]);
-
-
while(true) {
-
connsock=accept(ssock,0,0);
-
pid = fork();
-
if(pid==0) {
-
close(ssock);
-
rc = read(connsock,buf,2048);
-
-
sscanf(buf,"%s%s%s", &cmd, &uri, &proto); ///////////code added for 1
-
-
filename = uri + 1;
-
-
fd = open(filename,O_RDONLY);
-
if(strcmp(cmd,"GET")!=0 && strcmp(cmd, "HEAD")!=0 ) {
-
write(connsock,notimp,strlen(notimp));
-
close(connsock);
-
exit(0);
-
} else if(fd < 0) {
-
write(connsock,notfound,strlen(notfound));
-
close(connsock);
-
exit(0);
-
} else {
-
const char *ext = strrchr(uri,'.');
-
const char *type;
-
char ok2[128];
-
-
if(strcmp(ext,".html")==0 || strcmp(ext,".htm")) type="text/html";
-
else if(strcmp(ext,".jpg")==0 || strcmp(ext,".jpeg")==0)type="image/jpeg";
-
else type="text/plain";
-
sprintf(ok2,"Content-Type: %s\r\n\r\n", type);
-
-
write(connsock,ok1,strlen(ok1));
-
write(connsock,ok2,strlen(ok2));
-
-
if(strcmp(cmd,"GET")==0) {
-
while (fread(fbuf,1,512,fd)) write (connsock,fbuf,512); //*****
-
}
-
-
close(connsock);
-
exit(0);
-
}
-
}
-
// main "parent" process
-
close(connsock);
-
}
-
}
-
int makeserversocket(const char *port) {
-
struct addrinfo hints, *myaddr;
-
int ssock, s;
-
ssock = socket(AF_INET, SOCK_STREAM, 0);
-
memset(&hints, 0, sizeof(struct addrinfo));
-
hints.ai_family = AF_INET;
-
hints.ai_flags = AI_PASSIVE;
-
s = getaddrinfo(NULL, port, &hints, &myaddr);
-
if (s != 0) { cerr << "getaddrinfo failed\n"; exit(1); }
-
s = bind(ssock, myaddr->ai_addr, myaddr->ai_addrlen);
-
if (s<0) { cerr << "Could not bind\n"; exit(1); }
-
listen(ssock,5);
-
return ssock;
-
}
-
i get these errors
-ref-cw-08-09-prog1.cpp: In function 'int main(int, char**)':
ref-cw-08-09-prog1.cpp:74: error: invalid conversion from 'int' to 'FILE*'
ref-cw-08-09-prog1.cpp:74: error: initializing argument 4 of 'size_t fread(void*, size_t, size_t, FILE*)'
does anyone have any idea im totally stuck
thanks
|  | Expert | | Join Date: Mar 2007
Posts: 10,611
| | | re: BEGINNER c++ programmer help please
The fread function needs a FILE* to read from, you're supplying it with an int; just as the compiler told you so; btw, I added code tags around your code for readability.
kind regards,
Jos
| | Newbie | | Join Date: Jun 2009
Posts: 8
| | | re: BEGINNER c++ programmer help please
i have no idea how to do this
any help?
thank you
|  | AdministratorVoR | | Join Date: Feb 2006 Location: South West UK
Posts: 6,167
| | | re: BEGINNER c++ programmer help please
Perhaps you should be calling read rather than fread?
You should try to mix and match functions from 2 differing interfaces
open, read, write, close - OS provided direct access functions.
fopen, fread, fwrite, fclose - Standard C specified buffered access functions.
| | Newbie | | Join Date: Jun 2009
Posts: 8
| | | re: BEGINNER c++ programmer help please
i tried calling read rather than fread and it makes more errors
im totally stuck
| | Newbie | | Join Date: Jun 2009
Posts: 8
| | | re: BEGINNER c++ programmer help please
"Add an if condition that will write the whole file to the network socket if the command string
in cmd is equal to GET. The body of the if that sends the file contents will have to be a loop. The loop will read the
whole contents of the previously opened file using file descriptor fd and write the contents to newsck. Read into, and
write from, the array fbuf. The array is 512 bytes long so that is why a loop is needed"
this was the question that i was given
LINE 74
|  | AdministratorVoR | | Join Date: Feb 2006 Location: South West UK
Posts: 6,167
| | | re: BEGINNER c++ programmer help please Quote:
Originally Posted by iPaul i tried calling read rather than fread and it makes more errors
im totally stuck On the information you have given in this post my guess is that you have tightened the ribble sprocket too much I suggest you loosen it off.
Seriously those "errors" and in fact most compiler diagnostics are on the whole explicit and accurate about the error. What I said about mixing APIs stands, you can't call fread using a file id returned by open.
Did you just change "fread" to "read" or did you bother looking up the documentation on "read" to find out how you were supposed to call it? They do not take the same parameters.
|  | Expert | | Join Date: Mar 2007
Posts: 10,611
| | | re: BEGINNER c++ programmer help please
If all else fails you can try the fdopen() function; it associates a FILE* with a simple file descriptor (an int). But if you don't know what you're doing (and it looks like that) don't go there.
kind regards,
Jos
| | Expert | | Join Date: Mar 2008 Location: Naperville, Illinois U.S.
Posts: 831
| | | re: BEGINNER c++ programmer help please Quote:
Originally Posted by Banfa Perhaps you should be calling read rather than fread?
You should try to NOT mix and match functions from 2 differing interfaces
open, read, write, close - OS provided direct access functions.
fopen, fread, fwrite, fclose - Standard C specified buffered access functions. I'm certain Banfa meant for the word "NOT" to be present.
|  | | | | /bytes/about
We are a network of experts and professionals in IT and software development that help one another with answers to tough questions and share insights.
Get the best answers to your questions from over 226,419 network members.
|