1

これはwhileループで、このコードは機能しています。問題は、バッファサイズを減らして、バッファサイズよりも大きなデータを送信した場合、データを個別に受信することです。たとえば、170バイト(100バイトのバッファ)を送信すると、最初の100バイトが読み取られ、次に70バイトが読み取られます。これを処理するための最良の方法は何ですか?複数のユーザーがこのようなデータを送信する場合、それらの分離されたパケットを連結するにはどうすればよいですか?前もって感謝します..

while(m_severRun){
    int event_cnt = epoll_wait(m_epfd, m_events, EPOLL_SIZE, -1);
    if(event_cnt == -1){
        perror("epoll_wait error \n");
        break;
    }

    for(int i=0; i<event_cnt; i++){
        if(m_events[i].data.fd == m_serverSock){

            printf("ServerManager::eventAcceptLoop, A Client has been connected \n");

            struct sockaddr_in clnt_adr;
            socklen_t adr_sz = sizeof(clnt_adr);


            int clnt_sock = accept(m_serverSock, (struct sockaddr*)&clnt_adr, &adr_sz);
            if(!addClient(clnt_sock))
                break;
        }
        else{

            int str_len = read(m_events[i].data.fd, buf, BUF_SIZE);
            printf("read %d \n", str_len);

            if(str_len == 0){
                if(!removeClient(m_events[i].data.fd))
                    break;
                close(m_events[i].data.fd);

            }
            else {
                printf("ServerManager::eventAcceptLoop, A message has been received \n");
                //pushWork(buf);
                //write(m_events[i].data.fd, buf, str_len);
            }
        }
    }//for loop end
}//while loop end
4

1 に答える 1

1

可能性は低いですが、170 バイトのクライアント送信がサーバーに到着し、str_len が 1 の 170 read() が返される可能性があります。バイトをある種のプロトコル単位に連結する必要がある場合は、コードで明示的にこれを行う必要があります。アプリの最適な方法は、プロトコルとプロトコル ユニットの処理方法によって異なります。それは非常にアプリに依存しています。たとえば、プロトコルが CRLF で区切られたテキストの場合、受信した各バイトを区切り文字が見つかるまでいくつかのバッファー クラスにコピーしてから、pushwork(currentBufferInstance) を取得できます。

それはすべて、プロトコルと、サーバー上でデータを通信する方法と必要性に依存します。

Rgds、マーティン

于 2011-06-16T13:06:04.453 に答える