2013-03-06 2 views
0

Я на ранних этапах написания прокси-сервер в C для класса и во время отладки, моя программа дает мне странный выход simpley с двумя линиямиПочему я получаю «direct: //» в качестве вывода для моей программы?

прямыми: //

прямые: //

Что это значит? Раньше такого никогда не было. Программа даже выводит это, когда я не предоставляю 3 аргумента, которые я должен выполнить для этой программы.

#include <pthread.h> 
#include <unistd.h> 
#include <arpa/inet.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <time.h> 
#include <string.h> 

int main (int argc, char *argv[]){ 

    if(argc!=3){ 
     printf("Usage: proxy <IP address> <port no.>"); 
     exit(1); 
    } 

    int csock, ssock, clen, slen; 
    int csocka, ssocka; 
    int rc, fd, ttl; 
    char method[40]; 
    char uri[80]; 
    char prot[40]; 
    char cbuf[100]; 
    time_t logtime; 
    char * pch; 

    struct sockaddr_in caddr; 
    struct sockaddr_in caddr2; 
    struct sockaddr_in saddr; 
    struct sockaddr_in saddr2; 

    csock = socket(AF_INET, SOCK_STREAM, 0); 
    caddr.sin_family = AF_INET; 
    caddr.sin_addr.s_addr = inet_addr(argv[1]); 
    caddr.sin_port = htons(atoi(argv[2])); 
    clen = sizeof(caddr); 
    rc = bind(csock, (struct sockaddr *) &caddr, clen); 
    if(rc < 0){ 
     printf("bind failed"); 
     exit(1); 
    } 
    rc = listen(csock, 5); 
    if(rc < 0){ 
     printf("listen failed"); 
     exit(1); 
    } 
    printf("hey"); 
    csocka = accept(csock, (struct sockaddr *) &caddr2, &clen); 
    if(csocka < 0){ 
     printf("accept failed"); 
     exit(1); 
    } 

    while(1){ 
     read(csocka,&cbuf,sizeof(cbuf)); 
     time(&logtime);         //time of req. 
     if(cbuf==NULL){ 
     cerror("400 Bad Request: empty request"); 
     write(csocka, &errbuf, sizeof(errbuf)); 
     continue; 
     } 
     ttl = strlen(cbuf); 
     while(cbuf[ttl-1] == '\n' || cbuf[ttl-1] == '\r'){ 
     cbuf[ttl--] = '\0'; 
     } 
     if(sscanf(cbuf,"%[^ ] %[^ ] %[^ ]", method, uri, prot) != 3){ 
     cerror("400 Bad Request: Unexpected number of arguments"); 
     write(csocka, &errbuf, sizeof(errbuf)); 
     continue; 
     } 
     if(method!="GET" || method !="HEAD"){ 
     cerror("405 Method Not Allowed: GET/HEAD only"); 
     write(csocka, &errbuf, sizeof(errbuf)); 
     continue; 
     } 
     if(uri == (char*) 0){ 
     cerror("400 Bad Request: empty url"); 
     write(csocka, &errbuf, sizeof(errbuf)); 
     continue; 
     } 
     printf("%s \n", cbuf); 
    } 

    close(csocka); 

} 
+1

Вы уверены, что используете один и тот же двоичный файл, который вы скомпилировали, а не другую сборку или что-то еще на своем пути с тем же именем? – Useless

+0

Да, я уверен, что у меня скомпилировано несколько раз –

+1

У меня нет ответа, но мне было бы интересно узнать, откуда приходит схема «direct: //» URL и что это значит. Это не определенная схема в соответствии с IANA:

ответ

1

Наиболее вероятная причина в том, что вы не используете свою программу, а какую-то системную программу.

Если вы на машине Linux, типа:

which <program name>

, чтобы выяснить, какой исполняемый файл вы на самом деле работает.

Тип:

./<program name>

запустить вместо вашей программы (при условии, что вы находитесь в том же каталоге, что и исполняемый файл).

+0

спасибо, что это разрешило ... как возможно, что я запускал какую-то программу из совершенно другой директории ... –

+0

, когда вы вводите имя программы (без абсолютного или относительного пути), оболочка ищет переменную окружения '$ PATH' для совпадений. Вот почему я спросил, уверены ли вы, что вы запустили файл, который вы ожидали ... – Useless

+0

Я думаю, что большинство из нас допустило эту ошибку начинающего. Я назвал свою первую программу c 'test', и я был очень смущен, прежде чем понял, что я запускаю'/usr/bin/test', а не './Test'. –

0

Почему вы игнорируете возвращаемое значение read? Что заставляет вас думать read null-terminating cbuf для вас? Если read не является нулевым завершающим cbuf, то чем вы считаете безопасным, чтобы передать buf на strlen? Вы вызываете неопределенное поведение, передавая что-то, что не является строкой для strlen ... Следующее поведение может показаться странным или непоследовательным, но это характер неопределенного поведения.

int len = read(csocka,&cbuf,sizeof(cbuf)); 
if (len <= 0) { 
    /* something went wrong in read(). 
    * report an error and stop here... */ 
    break; 
} 
/* Once error checking is performed, len is the number of bytes recieved by read. */ 

Рассмотрите приведенный выше код. Вам нужна строка ttl=strlen(cbuf);, если вы правильно проверили наличие ошибок?

printf("%s \n", cbuf); неправ, потому что cbuf не является строкой. Рассмотрим fwrite(cbuf, len, stdout); putchar('\n'); или printf("%.*s\n", len, stdout);.

write(csocka, &errbuf, sizeof(errbuf)); также выглядит неправильно, но я оставлю это в ваших руках. Если вам нужно, чтобы мы исправляли эти ошибки, то ваш метод обучения работает не очень хорошо. Какую книгу ты читаешь?