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.
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 ); } } } }
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 ); } } } }
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.
Synes godt om
Slettet bruger
24. maj 2004 - 12:24#9
Sålænge koden ikke compiler, kan du jo ikke forbinde til nogetsomhelst.
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;
ved du så om hvordan man laver flere htmldokumenter i http header???
Synes godt om
Ny brugerNybegynder
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.