C言語によるプログラミング、応用編という本で分からないところがあり質問します。
wwwクライアントのプログラムです。
main.c
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/param.h> #include <sys/socket.h> #include <netdb.h> #include <netinet/in.h> #include <arpa/inet.h> 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 は、どういう意味であるのかということです。
よろしくお願いします。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/09 03:10