C - fopen (+priklad)

Videoshow videoshow na mypad.com
Pátek Srpen 4 17:44:49 CEST 2000


sorry,  este raz,  bez tych odraziek ">"

<EXAMPLE>
#include        <stdio.h>
#include        <sys/types.h>
#include        <sys/socket.h>
#include        <netinet/in.h>
#include        <arpa/inet.h>

#define SERV_TCP_PORT   80
#define SERV_HOST_ADDR  "194.45.127.81"    /*  <- www.buyersguidechem.de */

char *GETrequest = "GET /cgi-bin/BGlief.idc?pn=7356 HTTP/1.1\nHost: http://www.buyersguidechem.de\n\n;

/* podle HTTP protokolu je za pozadavkem prazdny radek, proto \n\n */

/* zapis n bytu do socketu, resp. posli n bytu serveru */
int writen(register int fd, register char *ptr, register int nbytes) {
  int nleft, nwritten;

  nleft = nbytes;
  while (nleft > 0) {
    nwritten = write(fd,ptr,nleft);
    if (nwritten <= 0) return (nwritten);

    nleft -= nwritten;
    ptr   += nwritten;
  }
  return (nbytes-nleft);
}

/* funkce nacte vami zadany dokument */
void getURL(int sockfd) {
  char buffer[BUFFER_SIZE], *screen;
  int readn, headerGone = 0;

  /* posli pozadavek a zjisti, jestli je OK */
  if (writen(sockfd,GETrequest,strlen(GETrequest)) != strlen(GETrequest)) {
    fprintf(stderr,"error during posting request\n");
    close(sockfd);
    exit(1);
  }

  /* cti odpoved ... */
  readn = read(sockfd,buffer,BUFFER_SIZE-1);
  buffer[readn] = '\0';
  /* ... zjisti prvni reakci, je kladna odpoved? */
  if ((char *)strstr((const char*)buffer,(const char *)"HTTP/1.1 200 OK") ==
      (char *)buffer) {
    /* cti dokud ti neco posila */
    while (readn > 0) {
      /* tato promenna zjistuje, zda uz sme za hlavickou nebo ne, zase */
      /* prazdny radek \n\n nebo \r\n\r\n */
      if (headerGone == 0) {
        /* nejsme za hlavickou, hledej prazdny radek */
        screen = (char *)strstr((const char*)buffer,(const char *)"\n\n");
        if (screen == NULL) {
          /* nenasel? zkus windozi konce radku */
          screen = (char *)strstr((const char*)buffer,(const char *)"\r\n\r\n");
          /* nasel? preskoc prazdny radek */
          if (screen != NULL) { screen += 4; }
        } else {
          /* nasel unixovy prazdny radek, preskoc ho */
          screen += 2;
        }
        /* nasel ten radek? pokud ano, tak vypis vse za nim z bufferu */
        if (screen != NULL) {
          printf("%s",screen);
          /* a nastav, ze je hlavicka za nama */
          headerGone = 1;
        }
      } else {
        /* hlavicka je za nama, vypis cely buffer, je to to co chceme */
        printf("%s",buffer);
      }
      /* pokus se nacist dalsi data */
      readn = read(sockfd,buffer,BUFFER_SIZE-1);
      buffer[readn] = '\0';
    }
  } else {
    /* nevratila se odpoved HTTP/1.1 200 OK, vypis chybu a odpoved serveru */
    screen = (char *)strstr(buffer,"\n"); *screen = '\0';
    fprintf(stderr,"error received: %s\n",buffer);
    exit(1);
  }
}

int main(int argc, char *argv[]) {
  int sockfd;
  struct sockaddr_in serv_addr;

  /* priprav strukturu na spojeni ze serverem na urcity port */
  bzero((char *)&serv_addr,sizeof(serv_addr));
  serv_addr.sin_family = AF_INET;
  serv_addr.sin_addr.s_addr = inet_addr(SERV_HOST_ADDR);
  serv_addr.sin_port = htons(SERV_TCP_PORT);

  /* vytvor socket a vrat jeho deskriptor */
  if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
    fprintf(stderr,"can't open stream socket\n");
    return 1;
  }

  /* inicializuj spojeni socketu, proste navaz spojeni */
  if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0) {
    fprintf(stderr,"can't connect to the server\n");
    return 1;
  }

  /* zavolej nasi funkci */
  getURL(sockfd);

  /* zavri socket z zmiz */
  close(sockfd);
  return 0;
}
</EXAMPLE>



Další informace o konferenci Linux