C chat-telnet?



  • Ich habs ja verstanden, nur verstehe ich nicht, warum das nicht läuft: Der Server sollte eigentlich was zurückgeben, aber das tut er nicht (bzw der client zeigts nicht an. Weis jemand warum?

    client:

    {
            int sockfd, new_fd;  /* listen on sock_fd, new connection on new_fd */
            struct sockaddr_in my_addr;    /* my address information */
            struct sockaddr_in their_addr; /* connector's address information */
            int sin_size;
    
            if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
                perror("socket");
                exit(1);
            }
    
            my_addr.sin_family = AF_INET;         /* host byte order */
            my_addr.sin_port = htons(MYPORT);     /* short, network byte order */
            my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */
            bzero(&(my_addr.sin_zero), 8);        /* zero the rest of the struct */
    
            if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) \
                                                                          == -1) {
                perror("bind");
                exit(1);
            }
    
            if (listen(sockfd, BACKLOG) == -1) {
                perror("listen");
                exit(1);
            }
    
            while(1) {  /* main accept() loop */
                sin_size = sizeof(struct sockaddr_in);
                if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, \
                                                              &sin_size)) == -1) {
                    perror("accept");
                    continue;
                }
                printf("server: got connection from %s\n", \
                                                   inet_ntoa(their_addr.sin_addr));
                if (!fork()) { /* this is the child process */
                    if (send(new_fd, "Hello, world!\n", 14, 0) == -1)
                        perror("send");
                    close(new_fd);
                    exit(0);
                }
                close(new_fd);  /* parent doesn't need this */
    
                while(waitpid(-1,NULL,WNOHANG) > 0); /* clean up child processes */
            }
        }
    

    server:

    {
            int sockfd, new_fd;  /* listen on sock_fd, new connection on new_fd */
            struct sockaddr_in my_addr;    /* my address information */
            struct sockaddr_in their_addr; /* connector's address information */
            int sin_size;
    
            if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
                perror("socket");
                exit(1);
            }
    
            my_addr.sin_family = AF_INET;         /* host byte order */
            my_addr.sin_port = htons(MYPORT);     /* short, network byte order */
            my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */
            bzero(&(my_addr.sin_zero), 8);        /* zero the rest of the struct */
    
            if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) \
                                                                          == -1) {
                perror("bind");
                exit(1);
            }
    
            if (listen(sockfd, BACKLOG) == -1) {
                perror("listen");
                exit(1);
            }
    
            while(1) {  /* main accept() loop */
                sin_size = sizeof(struct sockaddr_in);
                if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, \
                                                              &sin_size)) == -1) {
                    perror("accept");
                    continue;
                }
                printf("server: got connection from %s\n", \
                                                   inet_ntoa(their_addr.sin_addr));
                if (!fork()) { /* this is the child process */
                    if (send(new_fd, "Hello, world!\n", 14, 0) == -1)
                        perror("send");
                    close(new_fd);
                    exit(0);
                }
                close(new_fd);  /* parent doesn't need this */
    
                while(waitpid(-1,NULL,WNOHANG) > 0); /* clean up child processes */
            }
        }
    


  • sry, das mit emacs und dem kopieren klappt irgendwie nicht so. Egal, schon gelöst 😉



  • OK, jetzt hängts nur noch an einer Stelle. Das htmlfile wird nicht ausgegeben. Der Fehler muss wohl irgendwo hier liegen. Ich sende Folgendes an eine webaddresse:

    if (connect(sockfd, (struct sockaddr *)&their_addr, \
                                                  sizeof(struct sockaddr)) == -1) {
                perror("connect");
                exit(1);
            }
    	if (send(sockfd, "GET / HTML/1.1\n",15,0) == -1) {
    	  perror("send");}
    	if (send(sockfd, ("Host: %s\n",argv[1]), (7+(strlen(argv[1]))), 0) == -1){
                        perror("send");
                    close(sockfd);
                    exit(0);
                }
    	if (send(sockfd, "\n",1,0) == -1) { perror("send");}
    	if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1) {
    	  perror("recv");
    	  close(sockfd);
    	  exit(1);
    	}
    buf[numbytes] = '\0';
    printf("%s",buf);
    

    Kann mir jemand sagen, warum da kein HTML ausgegeben wird?



  • \r\n statt \n



  • und am Ende zwei mal \r\n

    Also:

    GET / HTML/1.1\r\n
    Host: host\r\n\r\n
    


  • '/n/n' wird doch bei allen standard Webservern benutzt. Richtig?

    MfG,
    ptI



  • ptI schrieb:

    '/n/n' wird doch bei allen standard Webservern benutzt. Richtig?

    MfG,
    ptI

    falsch!



  • Hallo,

    wo finde ich das

    Bejees Network tutorial??

    Danke und Gruß



  • ptI schrieb:

    '/n/n' wird doch bei allen standard Webservern benutzt. Richtig?

    MfG,
    ptI

    In der RFC zu HTTP steht drinnen, dass man '/n/r' benutzen muss. Wenn du also einen Webserver triffst, der sich strikt an die RFC haltet dann funkt \n\n nicht!



  • \r\n ist es laut der RFC. In der RFC steht aber auch das ein Server nur \n akzeptieren sollte.


Anmelden zum Antworten