質問: C言語によるプログラミング、応用編という本で分からないところがあり質問します。 wwwクライアントのプログラムです。 main.c ``` #include #include #include #include #include #include #include #include #include #include int parse_args(int argc,char *argv[],char **phostname,char **pfilepath); int init_sockaddr_in(char *hostname,struct sockaddr_in *sin); int client_process(int fd,char *hostname,char *filepath); int send_request(int fd,char *hostname,char *filepath); int recv_reply(int fd); int main(int argc,char *argv[]) { char *phostname,*pfilepath; int fd,ret=EXIT_FAILURE; struct sockaddr_in sin; printf("引数の解析...\n"); if(parse_args(argc,argv,&phostname,&pfilepath)) { fprintf(stderr,"使用法: %s -h [hostname] -f [filepath]\n", argv[0]); exit(EXIT_FAILURE); } printf("ソケット生成...\n"); if((fd=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP))<0) { fprintf(stderr,"ソケット生成に失敗しました\n"); exit(EXIT_FAILURE); } printf("アドレス構造体初期化...\n"); if(init_sockaddr_in(phostname,&sin)<0) { fprintf(stderr,"アドレス構造体の初期化に失敗しました\n"); goto close_socket; } printf("%sへ接続中...\n",inet_ntoa(sin.sin_addr)); if(connect(fd,(struct sockaddr*)&sin,sizeof(sin))<0) { fprintf(stderr,"サーバーへのに失敗しました\n"); goto close_socket; } ret=client_process(fd,phostname,pfilepath); close_socket: close(fd); return ret; } ``` client_process.c ``` int send_request(int fd,char *hostname,char *filepath); int recv_reply(int fd); int client_process(int fd,char *hostname,char *filepath) { printf("リクエスト送信中...\n"); if(send_request(fd,hostname,filepath)) { fprintf(stderr,"リクエスト送信に失敗しました\n"); return -1; } printf("データ受信中...\n"); if(recv_reply(fd)) { fprintf(stderr,"受信に失敗しました\n"); return -1; } printf("\n正常にデータを受信しました\n"); return EXIT_SUCCESS; } ``` recv_reply.c ``` int recv_reply(int fd) { fd_set readfds; char buf[256];/*データ受信バッファ*/ int length; while(1) { /*ディスクリプタ集合の初期化*/ FD_ZERO(&readfds); FD_SET(fd,&readfds); memset(buf,0,sizeof(buf)); /*サーバーからのデータの到着を待つ*/ if(select(fd+1,&readfds,NULL,NULL,NULL)<0) { fprintf(stderr,"selectに失敗しました"); return -1; } /*ディスクリプタに受信したデータがある?*/ if(FD_ISSET(fd,&readfds)) { /*データを受信*//*ここが不明点*/ length=recv(fd,buf,sizeof(buf-1),0); if(length<0) return -1; else if(length==0) /*受信正常終了*/ break; /*受信したデータを標準出力へ*/ printf("%*s",length,buf); } } return EXIT_SUCCESS; } ``` 質問は、データを受信して標準出力に出す、recv_reply関数です。 その中の、 recv(fd,buf,sizeof(buf-1),0);で、 sizeof(buf-1)の -1 は、どういう意味であるのかということです。 よろしくお願いします。
回答: バグですね。 おそらく、`sizeof(buf)-1`が頭の中にあったけど、指が違うように動いたということでしょう。 `sizeof(buf-1)`だと、`sizeof(char*)`と同じで普通は`8`。 `sizeof(buf)-1`だと、`100-1`で`99`です。 `-1`する理由としては、nob.さんの回答の通り。