Connecting Tech Pros Worldwide Forums | Help | Site Map

BEGINNER c++ programmer help please

Newbie
 
Join Date: Jun 2009
Posts: 8
#1: Jun 26 '09
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

JosAH's Avatar
Expert
 
Join Date: Mar 2007
Posts: 10,611
#2: Jun 26 '09

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
#3: Jun 29 '09

re: BEGINNER c++ programmer help please


i have no idea how to do this

any help?

thank you
Banfa's Avatar
AdministratorVoR
 
Join Date: Feb 2006
Location: South West UK
Posts: 6,167
#4: Jun 29 '09

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
#5: Jun 29 '09

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
#6: Jun 29 '09

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
Banfa's Avatar
AdministratorVoR
 
Join Date: Feb 2006
Location: South West UK
Posts: 6,167
#7: Jun 29 '09

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.
JosAH's Avatar
Expert
 
Join Date: Mar 2007
Posts: 10,611
#8: Jun 29 '09

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
#9: Jun 29 '09

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