1

ファイルを取得してクライアントに送信するために別のサーバーに接続するサーバーがあります。このコード (C - Linux) を書きましたが、最初の 4 バイトだけがクライアントに届きます。私よりも優れた誰かが間違いを見ることができますか?どうもありがとうございました

int Recv_file (int s, int f, char *ptr, size_t maxlen){
    int const TIMEOUT = 60; /* 60 seconds */
    size_t n;
    ssize_t nread;
    ssize_t nsend;
    char c;
    fd_set cset;
    struct timeval tval;
    int x;

    for (n=1; n<maxlen; n++)
    {
        FD_ZERO(&cset);
        FD_SET(s, &cset);
        tval.tv_sec = TIMEOUT;
        tval.tv_usec = 0;
        x = select(FD_SETSIZE, &cset, NULL, NULL, &tval);
        if (x==-1) {
            perror("select() failed");
            return -1; /* -1 = close connection with the client */
        }
        if (x>0) {
            nread=recv(s, &c, 1, 0);
            if (nread == 1)
            {
                *ptr++ = c;
                nsend = Send(f,&c,1);
                if (nsend != 1) {
                    return -1; /* close connection with the client  */
                }
            }else if (nread == 0){
                *ptr = 0;
                return (-1); /* close connection with the client  */
            }
            else
                return (-1); /* close connection with the client  */
        }else{
            printf("(It's been %d seconds and I have not received any response",TIMEOUT);
            close(s);
            return(-1); /* close connection with the client  */
        }
    }
    *ptr = 0;
    return (n); /* n == maxlen */
}

と:

int Send(int s, char *ptr, size_t nbytes){
    size_t  nleft;
    ssize_t nwritten;

    for (nleft=nbytes; nleft > 0; )
    {
        nwritten = send(s, ptr, nleft, 0);
        if (nwritten <=0)
            return (nwritten);
        else
        {
            nleft -= nwritten;
            ptr += nwritten;
        }
    }
    return (nbytes - nleft); /* number of bytes sent */
}

アップデート:

答えを待っている間、私は修正しました:

nread=recv(s, &c, 1, 0);nread=recv(s, &c, sizeof(c), 0);

Send(f,&c,1);Send(f,&c,sizeof(c));

しかし、今はファイルの最後のバイトを受け取りません!

ありがとうございました!

4

1 に答える 1