0

1 つのマネージャと 2 つのクライアントの合計 3 つのプロセスがあり、マネージャは両方のクライアントに TCP でメッセージを送信します。以下のコードはクライアントの一部です。すべてのパラメーターを add_to_ring 関数に渡し、渡されたパラメーターからの TCP ソケットから recv() を開始します。recv() 関数は正しいメッセージを受信し、両方のクライアントが正しいメッセージを受け取りましたが、この関数に渡されたパラメーターがすべて変更されていることがわかりました。誰が変更したのかわかりません。recv() の前は正しく、直後に変更されています。 recv() の間に何も起こりませんでした。これらのパラメーターを関数内の変数に割り当てようとしましたが、recv() の後、それらの変数も変更されました。それがなぜなのか誰にもわかりますか?ありがとう!

void add_to_ring(int pid,int s_sockfd,int i,traid_info *traidinfo,tcp_recv recvbytcp,     unsigned identifier, struct sockaddr_in my_addr)
{
    //receive add message from TCP
    printf("client %d:pid is %d,i is %d,nonce is %lu,identifier is %lu,port is  %d\n",i,pid,i,recvbytcp.nonce,identifier,my_addr.sin_port);
    char addmsg[100];
    int apid=pid;
    int as_sockfd=s_sockfd;
    int ai=i;
    tcp_recv arecvbytcp=recvbytcp;
    unsigned long int aidentifier=identifier;
    struct sockaddr_in amy_addr=my_addr;
    if((recv(s_sockfd, addmsg, MAXDATASIZE, 0)) == -1)
    {
        perror("recv1");
        exit(1);
    }
    printf("client %d:pid is %d,i is %d,nonce is %lu,identifier is %lu,port is  %d\n",i,pid,i,recvbytcp.nonce,identifier,my_addr.sin_port);
    printf("client %d:pid is %d,i is %d,nonce is %lu,identifier is %lu,port is %d\n",ai,apid,ai,arecvbytcp.nonce,aidentifier,amy_addr.sin_port);
    //start add to ring
    if(addmsg[0]=='a')
    {
    if(i==1)
    {
        traidinfo->succ_port = recvbytcp.FP;
        traidinfo->succ_identifier = identifier;
        traidinfo->pred_port = recvbytcp.FP;
        traidinfo->pred_identifier = identifier;
        traidinfo->my_port = my_addr.sin_port;
        traidinfo->my_identifier = identifier;
    }
}
    printf("client %d:pid is %d,i is %d,nonce is %lu,identifier is %lu,port is %d\n",ai,apid,ai,arecvbytcp.nonce,aidentifier,amy_addr.sin_port);

    //finished adding,send back my message by TCP
    char msg2man[100];
    data_process(arecvbytcp.nonce, msg2man, apid, amy_addr.sin_port);
    printf("client %d: port is %lu\n",ai,amy_addr.sin_port);
    if(send(as_sockfd, msg2man, MAXDATASIZE, 0) == -1)
    {
        perror("send");
        exit(1);
    }
}
4

2 に答える 2

0

配列に収まりきらない量を受信 (および送信) する可能性があるという問題に加えて、TCP は、要求したものすべて、または完全なメッセージを受信することを約束しないことを覚えておく必要があります。

受け取った金額を確認する必要があり、少ない場合はバッファに追加しながら再度受け取る必要があります。

于 2013-10-23T11:31:26.917 に答える