私はこの分野で新しく、1つのサーバーとクライアントを作成していますが、すべてのコンテンツを手に入れることはできませんが、いくつかの小さなクリップは本当に混乱します。 私のサーバコード:Cソケットで、私のサーバーがコンテンツ全体を受信できないのはなぜですか?
read(connfd, name, 20);
//recv(connfd,name,1024,0);
char* a=name;
while(a[0]!='\n'){
a++;
}
a[0]='\0';
printf("name:%s\n", name);
read(connfd, size, 20);
printf("size:%s\n", size);
recv(connfd,buf,8192,0);
printf("buf:%s\n", buf);
if((stream = fopen(name,"w+t"))==NULL){
printf("The file was not opened! \n");
}
int write_length = fwrite(buf,sizeof(char),8192,stream);
bzero(buf,8192);
if(put){
char *res="OK\n";
write(connfd, res, 1024);
}
fclose(stream);
と私のクライアントコードは次のとおりです。今
char buffer[8192];
bzero(buffer,8192);
char * put="PUT\n";
if ((write(fd, put, 8192)) <= 0) {
if (errno != EINTR) {
fprintf(stderr, "Write error: %s\n", strerror(errno));
exit(0);
}
}
struct stat st ;
stat(put_name, &st);
char str[100];
sprintf(str, "%d", st.st_size);
int len;
char *current=NULL;
len=strlen(put_name);
char sendname[1024];
strcpy(sendname,put_name);
strcat(sendname,"\n");
write(fd, sendname, 10);
strcat(str,"\n");
write(fd, str, 10);
FILE *stream;
if((stream = fopen(put_name,"r"))==NULL)
{
printf("The file was not opened! \n");
exit(1);
}
int lengsize = 0;
while((lengsize = fread(buffer,1,8192,stream)) > 0){
if(send(fd,buffer,8192,0)<0){
printf("Send File is Failed\n");
break;
}
bzero(buffer, 8192);
}
、私はすべてのコンテンツを送信することができますが、それらの一部を受け取ることができます。例えば、私のMacでは、サーバは名前を受け取ることができますが、str
は無視されます。サーバのstrを出力すると、ファイルの内容が表示されます。ファイルの内容はファイル内容全体ではありません。一部のコンテンツは消えます。理由を教えてください。
'read'と' recv'」の上がらないし要求されたバイト数を返すことが保証されています。彼らの戻り値をチェックして、あなたが読んでいるものの終わりを見つけるまで、読書を続けなければなりません。同様に、 'write'(と' send'?)は要求されたバイト数を送信しないかもしれません。その戻り値をチェックしてループで呼び出す必要があります。 – ikegami
あなたはいくつかの例を挙げることができますか?感謝します! –