0

私はクラス用にcでプロキシサーバーを作成する初期段階にあり、デバッグ中に、プログラムは2行の単純な奇妙な出力を表示します。

直接://

直接://

これは何を意味するのでしょうか?私はこれまでこれが起こったことがありません。このプログラムの実行に必要な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);

}
4

2 に答える 2

1

最も可能性の高い理由は、プログラムを実行しているのではなく、何らかのシステム プログラムを実行していることです。

Linux マシンを使用している場合は、次のように入力します。

which <program name>

実際に実行している実行可能ファイルを確認します。

タイプ:

./<program name>

代わりにプログラムを実行するには (実行可能ファイルと同じディレクトリにいる場合)。

于 2013-03-06T14:18:19.253 に答える
0

の戻り値を無視するのはなぜreadですか? あなたにとってreadヌル終了だと思うcbuf理由は何ですか? readnull が終了していない場合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));も間違っているように見えますが、それはあなたの手に委ねます。この種のエラーを修正する必要がある場合は、学習方法がうまく機能していません。あなたはどの本を読んでいますか。

于 2013-03-06T14:29:36.567 に答える