0
//server side
void* s2(void *arg){
    info *s = (info*)arg;
    char buffer[MAXS];
    int k;
    sockaddr_in addr;
    socklen_t aSize = sizeof(sockaddr_in);
    int sfd = accept(s->fd,(sockaddr*)&addr,(socklen_t*)&aSize);
    if(sfd<0){
        s->current--;
        pthread_exit(0);
    }
    while(1){
        k = recv(sfd,buffer,MAXS,0);
        cout<<buffer<<"\n";
        //1. k ==0 socket has been closed by client 
        //2. k==-1 error in recv 
        //3. recv quit
        if((k==-1)||(!strncmp(buffer,"quit",4))||(k==0))break; 
        sprintf(buffer,"%d\n",(int)strlen(buffer)); //Convert length to  string using sprintf()
        send(sfd,buffer,strlen(buffer),0); //send buffer to client 
    }
    close(sfd);
    if(s->limit==s->current)
    FD_SET(s->fd,&sfds);
    s->current--; //decreament the client number 
    pthread_exit(0);
}

//client side
1. send(sockfd,"sadhdag",8,0);
2. send(sockfd,"ss",3,0);

sadhdagrecvへの最初の呼び出しでのサーバー recv 。

recv サーバーへの 2 回目の呼び出しで recv

ss
dag

サーバ側:

関数 s2 はスレッドによって実行され、引数がソケット情報とともに渡されます。そこで接続が受け入れられ、新しく受け入れられたクライアントで send と recv が呼び出されます。

なぜこれが起こっているのですか?またはこれを回避する方法は?

4

2 に答える 2

3

によって返されるカウントを無視していますrecv()。コメントの提案に反してmemset()、バッファをゼロにする必要はありませんrecv()が、その後はそのバッファをそのカウントまでのみ使用する必要があります。例えば:

printf("%s", buffer);

は間違っており、

printf("%.*s", count, buffer);

は正しい。

注意

if((k==-1)||(!strncmp(buffer,"quit",4))||(k==0))break;

も正しくありません。そのはず

if((k==-1)||(k==0)||(k >= 4 && !strncmp(buffer,"quit",4))) break;

が正でない限り、バッファーを調べることはまったく有効ではありません。また、バッファー内に 4 文字k含まれていない限り、バッファー内の4 文字を比較することは有効ではありません。

于 2015-02-26T04:21:35.567 に答える