3

Ubuntu 12.0432ビット版を使用しています。TCPクライアントからXMLファイルを受信するプログラムを作成しました。同じプログラムが、UNIXドメインソケットによって別のプロセスからデータを受信して​​います。そのために、poll()システムコールを使用しています。

私の問題は、XMLデータが正しく取得されない場合や、XMLデータが欠落している場合があります。しかし、私はTCPを使用しているので、データ損失があるかどうかをクライアントが認識します。しかし、クライアントはエラーを表示していません。なぜこれが起こっているのか誰か教えてもらえますか?

私はいくつかのコードを提供することができます:

int config_server_tcp(int port)
{{   
    int sockfd = -1;
    struct sockaddr_in my_addr; //私の住所情報
    if((sockfd = socket(AF_INET、SOCK_STREAM、0))== -1)
    {{
        perror( "socket()failed。");
    }
    そうしないと
    {{
        my_addr.sin_family = AF_INET;
        my_addr.sin_port = htons(port);
        my_addr.sin_addr.s_addr = htonl(INADDR_ANY); //自動的に私のIPを入力します
        memset(&(my_addr.sin_zero)、0、8); //残りの構造体をゼロにします
        if(bind(sockfd、(struct sockaddr *)&my_addr、sizeof(struct sockaddr))== -1)
        {{
            perror( "bind()が失敗しました。");
        }
        そうしないと
        {{
            if(listen(sockfd、8)== -1)
            {{
                perror( "listen()が失敗しました。");
            }
        }
    }
    sockfdを返します。
}

int send_to_tcp_server(unsigned char *メッセージ、intサイズ、char * server_ip、intポート)
{{
    int sockfd;
    struct sockaddr_in their_addr;
    int numbytes = -1;
    if((sockfd = socket(AF_INET、SOCK_STREAM、0))== -1)
    {{
        perror( "socket()failed。");
    }
    そうしないと
    {{
        their_addr.sin_family = AF_INET;
        their_addr.sin_port = htons(port);
        their_addr.sin_addr.s_addr = inet_addr(server_ip);
        memset(&(their_addr.sin_zero)、'\ 0'、8); //残りの構造体をゼロにします
        if(connect(sockfd、(struct sockaddr *)&their_addr、sizeof(their_addr))== -1)
        {{
            perror( "connect()が失敗しました。");
        }
        そうしないと
        {{
            if((numbytes = send(sockfd、message、size、0))== -1)
            {{
                printf("送信に失敗しました。\n");
            }
        }
        close(sockfd);
    }
    numbytesを返します。
}


void process_tcp(int sock)
{{
    struct sockaddr_in their_addr; //話者の住所情報
    受け取ったint;
    socklen_t addr_len;
    char buffer [BUFF_SIZE];

    addr_len = sizeof(their_addr);
    int clientfd = accept(sock、(struct sockaddr *)&their_addr、&addr_len);
    if(clientfd == -1)
    {{
        perror( "accept()が失敗しました。");
    }       
    そうしないと
    {{
        行う
        {{
            受信=recv(clientfd、buffer、BUFF_SIZE、0);
            if(受信== -1)
            {{
                perror( "recv()が失敗しました。");
                壊す;
            }
            そうしないと
            {{
                //何かをする
            }
        }
        while(受信!= 0);
        close(clientfd);
    }
}

プロセスTCP関数がループで呼び出されます

4

1 に答える 1

5

バグはほぼ間違いなく、表示しなかったコード、つまりXML-over-TCPプロトコルに従ってアプリケーションレベルのメッセージをアセンブルするコードにあります。これを行う1つの方法は次のとおりです。

void process_tcp (int sock)
{
    struct sockaddr_in their_addr;
    int received, total_received;
    socklen_t addr_len;
    char buffer[BUFF_SIZE];

    addr_len = sizeof (their_addr);
    int clientfd = accept (sock, (struct sockaddr *)&their_addr, &addr_len);
    if (clientfd == -1)
    {
        perror("accept() failed.");
    }       
    else
    {
        total_received = 0;
        do
        {
            received = recv(clientfd, buffer + total_received,
                            BUFF_SIZE - total_received, 0);
            if (received == -1) 
            {
                perror("recv() failed.");
                break;
            }
            if (received > 0)
                total_received += received;
        }
        while (received != 0);
        buffer[total_received] = 0;
        // here we can do something with 'buffer'              
        close (clientfd);
    }
}

多くのエラーチェックが欠落していることに注意してください。

于 2012-10-12T11:39:30.853 に答える