Connecting Tech Pros Worldwide Help | Site Map

BEGINNER c++ programmer help please

  #1  
Old June 26th, 2009, 01:51 PM
Newbie
 
Join Date: Jun 2009
Posts: 8
hi

this is my code
Expand|Select|Wrap|Line Numbers
  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <netdb.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <iostream>
  7. #include <fcntl.h>
  8. using namespace std;
  9. extern int makeserversocket(const char *);
  10.  
  11. const char *notimp="HTTP/1.0 501 Method Not Implemented\r\n"
  12.     "Server: Work-in-Progress\r\n"
  13.     "Content-Length: 61\r\n"
  14.     "Connection: close\r\n"
  15.     "Content-Type: text/html\r\n"
  16.     "\r\n"
  17.     "<h1>Method Not Implemented</h1>\r\n"
  18.     "Invalid method in request.\r\n";
  19.  
  20. const char *notfound="HTTP/1.0 404 Not Found\r\n"
  21.     "Server: Work-in-Progress\r\n"
  22.     "Content-Length: 25\r\n"
  23.     "Connection: close\r\n"
  24.     "Content-Type: text/html\r\n"
  25.     "\r\n"
  26.     "<h1>file not found</h1>\r\n";
  27.  
  28. const char *ok1="HTTP/1.0 200 OK\r\n"
  29.     "Server: Work-in-Progress\r\n"
  30.     "Connection: close\r\n";
  31.  
  32. int main(int argc, char *argv[]){
  33.   int ssock, connsock, rc, pid, n, fd;
  34.   char buf[2048], fbuf[512], cmd[16], uri[256], proto[16];
  35.   char *filename;
  36.  
  37.   if(argc != 2) { cerr << "usage: server port\n"; exit(1); }
  38.   ssock=makeserversocket(argv[1]);
  39.  
  40.   while(true) {
  41.     connsock=accept(ssock,0,0);
  42.     pid = fork();
  43.     if(pid==0) {
  44.       close(ssock);
  45.       rc = read(connsock,buf,2048); 
  46.  
  47.       sscanf(buf,"%s%s%s", &cmd, &uri, &proto);  ///////////code added for 1
  48.  
  49.       filename = uri + 1;
  50.  
  51.       fd = open(filename,O_RDONLY);
  52.       if(strcmp(cmd,"GET")!=0 && strcmp(cmd, "HEAD")!=0 ) {  
  53.         write(connsock,notimp,strlen(notimp));
  54.         close(connsock);
  55.         exit(0);
  56.       } else if(fd < 0) {
  57.         write(connsock,notfound,strlen(notfound));
  58.         close(connsock);   
  59.         exit(0);
  60.       } else {
  61.         const char *ext = strrchr(uri,'.');
  62.         const char *type;
  63.         char ok2[128];
  64.  
  65.         if(strcmp(ext,".html")==0 || strcmp(ext,".htm")) type="text/html";
  66.     else if(strcmp(ext,".jpg")==0 || strcmp(ext,".jpeg")==0)type="image/jpeg"; 
  67.         else type="text/plain";
  68.         sprintf(ok2,"Content-Type: %s\r\n\r\n", type);
  69.  
  70.         write(connsock,ok1,strlen(ok1));
  71.         write(connsock,ok2,strlen(ok2));
  72.  
  73.         if(strcmp(cmd,"GET")==0) {
  74.       while (fread(fbuf,1,512,fd))  write (connsock,fbuf,512);  //*****
  75.     }
  76.  
  77.         close(connsock);
  78.         exit(0);
  79.       }
  80.     } 
  81.     // main "parent" process
  82.     close(connsock);
  83.   }
  84. }
  85. int makeserversocket(const char *port) {
  86.   struct addrinfo hints, *myaddr;
  87.   int ssock, s;
  88.   ssock = socket(AF_INET, SOCK_STREAM, 0);
  89.   memset(&hints, 0, sizeof(struct addrinfo));
  90.   hints.ai_family = AF_INET; 
  91.   hints.ai_flags = AI_PASSIVE;   
  92.   s = getaddrinfo(NULL, port, &hints, &myaddr);
  93.   if (s != 0) { cerr << "getaddrinfo failed\n"; exit(1); }
  94.   s = bind(ssock, myaddr->ai_addr, myaddr->ai_addrlen);
  95.   if (s<0) { cerr << "Could not bind\n";  exit(1);  }
  96.   listen(ssock,5);
  97.   return ssock;
  98. }
  99.  
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
  #2  
Old June 26th, 2009, 02:11 PM
JosAH's Avatar
Expert
 
Join Date: Mar 2007
Posts: 10,634
Provided Answers: 2

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
  #3  
Old June 29th, 2009, 01:12 PM
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
  #4  
Old June 29th, 2009, 01:18 PM
Banfa's Avatar
AdministratorVoR
 
Join Date: Feb 2006
Location: South West UK
Posts: 6,117
Provided Answers: 6

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.
  #5  
Old June 29th, 2009, 01:22 PM
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
  #6  
Old June 29th, 2009, 01:26 PM
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
  #7  
Old June 29th, 2009, 01:59 PM
Banfa's Avatar
AdministratorVoR
 
Join Date: Feb 2006
Location: South West UK
Posts: 6,117
Provided Answers: 6

re: BEGINNER c++ programmer help please


Quote:
Originally Posted by iPaul View Post
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.
  #8  
Old June 29th, 2009, 03:06 PM
JosAH's Avatar
Expert
 
Join Date: Mar 2007
Posts: 10,634
Provided Answers: 2

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
  #9  
Old June 29th, 2009, 03:13 PM
Expert
 
Join Date: Mar 2008
Location: Naperville, Illinois U.S.
Posts: 805
Provided Answers: 3

re: BEGINNER c++ programmer help please


Quote:
Originally Posted by Banfa View Post
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.
Reply


Similar Threads
Thread Thread Starter Forum Replies Last Post
One line...parse error? New programmer needs help please! floofy answers 3 January 19th, 2007 06:39 AM
Please help me with these problems.... [homework] vengeboyz answers 3 September 11th, 2006 03:29 AM
Beginner Programmer Question kydavis77@gmail.com answers 15 June 26th, 2006 08:45 PM
Starting University COSC and learning JAVA, advice please :D David Van D answers 1 February 4th, 2006 02:45 AM