Avatar billede tufsy Nybegynder
19. maj 2004 - 11:59 Der er 15 kommentarer

kontakt mellem server og browser

Hej

hvorfor kan jeg ikke få kontakt mellem min server og browser??
koden kommer her:

void* serveClient( void* socket )
{
  char buffer[256];
  for(;;) {
    strcpy( buffer, "HTTP/1.0 200 OK\r\nDate:Tues, 17 May 19:37:00 GMT\r\nContent-Length: %d\r\nContent-Type:text/html/r/nConnection: Keep-Alive\r\n\r\n%s", <cr><lf><cr><lf><HTML> .tryk X for at stoppe.....<FORM> sdsadlsadlsa <SUBMIT method=post, .............</FORM></HTML>" +'\0');
    write( (int)socket, buffer, strlen(buffer) );
    if (read( (int)socket, buffer, 255) > 0 ) {
      if ( buffer[0] == 'X' ) {
    close( (int)socket );
    pthread_exit( NULL );
      }
Avatar billede Slettet bruger
19. maj 2004 - 17:47 #1
Det er da ikke den komplette kode, eller hvad?

Prøv at beskrive mere præcist hvad du gør, hvilke fejl du får og den slags, så vi har noget at arbejde med.
Avatar billede bertelbrander Novice
19. maj 2004 - 19:37 #2
Jeg tror at din strcpy skal være en sprintf.
Det undrer mig at du både har \r\n og /r/n of <cr><lf> i din streng.
Så vidt jeg kan se kan det ikke kompileres som det er.
Avatar billede tufsy Nybegynder
21. maj 2004 - 12:51 #3
Nej det har du ret i,den komplete kode kommer her:

og af fejlmeldinger får jeg blot,der er ingen kontakt til server.
/**************************
**
** simple multi-threaded server
**
**
*/
#define _REENTRANT
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>
#include <unistd.h>

/* the port on which to accept connections */
#define SERVERPORT 12345
/* function prototypes */
void* serverWatch( void* );
void* serveClient( void* );
int main( void )
{
  pthread_t watcher_thr;
  pthread_create(&watcher_thr, NULL, serverWatch, (void*)NULL);
  for(;;) {
    /* do something useful */
    printf( "server is running\n" );
    /* pthread_yield(); */
    sched_yield();
    sleep(1);
  }
}
/*************
**
** serverWatch()
**
** watch for a client trying to connect
**
** the argument to the function is not used
**
*/
void* serverWatch( void* dummy )
{
  pthread_t dummy_thr;
  int srv_socket;
  int accepted_socket;
  int size;
  struct sockaddr_in port_addr, accept_addr;
  int set_opt = 1;

  fd_set read_set;
  int ready_fd;
  /* set up the socket on the server port */
  port_addr.sin_family = AF_INET;
  port_addr.sin_addr.s_addr = htonl( INADDR_ANY );
  port_addr.sin_port = htons( SERVERPORT );
  srv_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  setsockopt( srv_socket, SOL_SOCKET, SO_REUSEADDR,
          (char*)&set_opt, sizeof( set_opt ) );
  bind( srv_socket, (struct sockaddr*)&port_addr, sizeof(port_addr));
  for(;;) {
    /* wait for the client to try to connect */
    listen( srv_socket, 5 );
    FD_ZERO(&read_set);
    FD_SET( srv_socket, &read_set );
    do {
      ready_fd = select(srv_socket+1, &read_set, NULL, NULL, NULL);
    }
    while (ready_fd <= 0 || !FD_ISSET(srv_socket, &read_set) );
    /* a client has connected. Accept their connection and create a
    * thread to serve the client
    */
    size = sizeof( accept_addr );
    accepted_socket = accept(srv_socket, (struct sockaddr*)&accept_addr,
                  &size);
    pthread_create(&dummy_thr, NULL, serveClient, (void*)accepted_socket);
  }
}
/*************
**
** serve the client on the specified socket
**
*/
void* serveClient( void* socket )
{
  char buffer[256];
  for(;;) {
    strcpy( buffer, "HTTP/1.0 200 OK\r\nDate:Tues, 17 May 19:37:00 GMT\r\nContent-Length: %d\r\nContent-Type:text/html/r/nConnection: Keep-Alive\r\n\r\n%s", <cr><lf><cr><lf><HTML> .tryk X for at stoppe.....<FORM> sdsadlsadlsa <SUBMIT method=post, .............</FORM></HTML>" +'\0');
    write( (int)socket, buffer, strlen(buffer) );
    if (read( (int)socket, buffer, 255) > 0 ) {
      if ( buffer[0] == 'X' ) {
    close( (int)socket );
    pthread_exit( NULL );
      }
    }
  }
}

sprintf( buffer, "HTTP/1.0 200 OK\r\nDate:Mon, 01 May 19:37:00 GMT\r\nContent-Length: %d\r\nContent-Type:text/html\r\nConnection: Keep-Alive\r\n\r\n%s",strlen(html),html);
                write( (int)socket, buffer, strlen(buffer) );
Avatar billede tufsy Nybegynder
24. maj 2004 - 11:52 #4
Nej det har du ret i,den komplete kode kommer her:

og af fejlmeldinger får jeg blot,der er ingen kontakt til server.
/**************************
**
** simple multi-threaded server
**
**
*/
#define _REENTRANT
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>
#include <unistd.h>

/* the port on which to accept connections */
#define SERVERPORT 12345
/* function prototypes */
void* serverWatch( void* );
void* serveClient( void* );
int main( void )
{
  pthread_t watcher_thr;
  pthread_create(&watcher_thr, NULL, serverWatch, (void*)NULL);
  for(;;) {
    /* do something useful */
    printf( "server is running\n" );
    /* pthread_yield(); */
    sched_yield();
    sleep(1);
  }
}
/*************
**
** serverWatch()
**
** watch for a client trying to connect
**
** the argument to the function is not used
**
*/
void* serverWatch( void* dummy )
{
  pthread_t dummy_thr;
  int srv_socket;
  int accepted_socket;
  int size;
  struct sockaddr_in port_addr, accept_addr;
  int set_opt = 1;

  fd_set read_set;
  int ready_fd;
  /* set up the socket on the server port */
  port_addr.sin_family = AF_INET;
  port_addr.sin_addr.s_addr = htonl( INADDR_ANY );
  port_addr.sin_port = htons( SERVERPORT );
  srv_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  setsockopt( srv_socket, SOL_SOCKET, SO_REUSEADDR,
          (char*)&set_opt, sizeof( set_opt ) );
  bind( srv_socket, (struct sockaddr*)&port_addr, sizeof(port_addr));
  for(;;) {
    /* wait for the client to try to connect */
    listen( srv_socket, 5 );
    FD_ZERO(&read_set);
    FD_SET( srv_socket, &read_set );
    do {
      ready_fd = select(srv_socket+1, &read_set, NULL, NULL, NULL);
    }
    while (ready_fd <= 0 || !FD_ISSET(srv_socket, &read_set) );
    /* a client has connected. Accept their connection and create a
    * thread to serve the client
    */
    size = sizeof( accept_addr );
    accepted_socket = accept(srv_socket, (struct sockaddr*)&accept_addr,
                  &size);
    pthread_create(&dummy_thr, NULL, serveClient, (void*)accepted_socket);
  }
}
/*************
**
** serve the client on the specified socket
**
*/
void* serveClient( void* socket )
{
  char buffer[256];
  for(;;) {
    strcpy( buffer, "HTTP/1.0 200 OK\r\nDate:Tues, 17 May 19:37:00 GMT\r\nContent-Length: %d\r\nContent-Type:text/html/r/nConnection: Keep-Alive\r\n\r\n%s", <cr><lf><cr><lf><HTML> .tryk X for at stoppe.....<FORM> sdsadlsadlsa <SUBMIT method=post, .............</FORM></HTML>" +'\0');
    write( (int)socket, buffer, strlen(buffer) );
    if (read( (int)socket, buffer, 255) > 0 ) {
      if ( buffer[0] == 'X' ) {
    close( (int)socket );
    pthread_exit( NULL );
      }
    }
  }
}

sprintf( buffer, "HTTP/1.0 200 OK\r\nDate:Mon, 01 May 19:37:00 GMT\r\nContent-Length: %d\r\nContent-Type:text/html\r\nConnection: Keep-Alive\r\n\r\n%s",strlen(html),html);
                write( (int)socket, buffer, strlen(buffer) );
Avatar billede Slettet bruger
24. maj 2004 - 11:59 #5
Hvordan forsøger du at forbinde til serveren?
Fra samme maskine eller en anden?
Er der en firewall på serveren? (eller mellem server og klient)
Avatar billede tufsy Nybegynder
24. maj 2004 - 12:01 #6
Jeg prøver at forbinde fra samme maskine og nej der er ikke firewall på serveren.

men jeg tror det er bufferen der er noget i vejen med, men hvad det kan jeg ikke finde ud af.
Avatar billede Slettet bruger
24. maj 2004 - 12:07 #7
Jeg kan ikke forstå, hvis denne linie ikke giver fejl, når du compiler:

strcpy( buffer, "HTTP/1.0 200 OK\r\nDate:Tues, 17 May 19:37:00 GMT\r\nContent-Length: %d\r\nContent-Type:text/html/r/nConnection: Keep-Alive\r\n\r\n%s", <cr><lf><cr><lf><HTML> .tryk X for at stoppe.....<FORM> sdsadlsadlsa <SUBMIT method=post, .............</FORM></HTML>" +'\0');
Avatar billede tufsy Nybegynder
24. maj 2004 - 12:09 #8
det gør den også, da jeg overhovedet ikke kan forbinde den til serveren, men selvom jeg skriver printf istedet for strcpy og sletter <cr><lf><cr><lf>, virker den stadig ikke.
Avatar billede Slettet bruger
24. maj 2004 - 12:24 #9
Sålænge koden ikke compiler, kan du jo ikke forbinde til nogetsomhelst.
Avatar billede tufsy Nybegynder
24. maj 2004 - 13:22 #10
men jeg kan ikke finde fejlen, det er derfor jeg tror det er bufferen der er noget i vejen med
Avatar billede tufsy Nybegynder
24. maj 2004 - 13:54 #11
nu får jeg en ny fejlmelding den siger "invalid syntax error"
Avatar billede tufsy Nybegynder
25. maj 2004 - 17:05 #12
nu har jeg rettet fejlen i koden og den komplierer, men der er stadig ikke hul igennem til browseren, hvad kan der mon nu være galt???

den nye kode kommer her

void* serveClient( void* socket )
{
  char buffer[256];
  for(;;) {
  int i = 8;
  sprintf( buffer,"HTTP/1.0 200 OK\r\nDate:Tues, 17 May 19:37:00 GMT\r\nContent-Length: %d\r\nContent-Type:text/html/r/nConnection: Keep-Alive\r\n\r\n%s", i ,"<HTML> .tryk X for at stoppe.....<FORM> sdsadlsadlsa <SUBMIT method=post, .............</FORM></HTML>" +'\0');
    write( (int)socket, buffer, strlen(buffer) );
    if (read( (int)socket, buffer, 255) > 0 ) {
      if ( buffer[0] == 'X' ) {
    close( (int)socket );
    pthread_exit( NULL );
      }
Avatar billede Slettet bruger
25. maj 2004 - 17:10 #13
Sender du virkelig ikke noget, der ligner et komplet HTML-dokument?
Avatar billede tufsy Nybegynder
26. maj 2004 - 11:03 #14
nu har jeg fået kontakt til serveren, men den skal i princippet kun vise den tekst der står i body'en, men den viser også httpheaderen, hvorfor gør den det???

/
void* serveClient( void* s )
{
int socket = (int) s;

  char buffer[256],b[255];
  //for(;;) {
  sprintf(b,"HTTP/1.0 200 OK\r\nContent-Length:255\r\nContent-Type:text/html\r\nConnection: Keep-Alive\r\n\r\n<HTML><HEAD><TITLE>Webserver</TITLE></HEAD><BODY>Halli Hallo</BODY></HTML>" +'\0');
  int i = strlen(b)+1;
  //int i = 15;
  bzero(b,255);
  sprintf(buffer,"HTTP/1.0 200 OK\r\nContent-Length:%d\r\nContent-Type:text/html\r\nConnection: Keep-Alive\r\n\r\n<HTML><HEAD><TITLE>Webserver</TITLE></HEAD><BODY>Halli Hallo</BODY></HTML>" +'\0',i);
  printf(buffer);
  printf("\n");
  write(socket, buffer, strlen(buffer)+1 );
  bzero(buffer,256);
  //  if (read(socket, buffer, 256) > 0 ) {
    //  if ( buffer[0] == 'X' ) {
    close(socket );
    pthread_exit( NULL );
Avatar billede tufsy Nybegynder
26. maj 2004 - 16:03 #15
det virker så også nu...

ved du så om hvordan man laver flere htmldokumenter i http header???
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester