1

まず、c++ でコーディングし、Linux/CentOS 6.4 で実行しています。

それで、本当に長い間、ソケットに関するさまざまな本を読んだ後、少なくともクライアントとサーバーが部分的に機能するようになりました。

最初に、さまざまなクライアントからのメッセージを継続的に受け入れたいと考えています。すでにクライアントをセットアップしており、最終的に少なくとも正常にコンパイルされました。次に、適切にテストできるようにサーバーをセットアップする必要があります。

私が行っているのは、各クライアント/哲学者が異なるプロセスを表すソケットを使用して、食事する哲学者の問題を実装することです。私は、サーバーがすべてのクライアントの状態など、すべてを追跡しようとしているこのすべてを調べようとしていました。それは難しすぎました。サーバーにステータスを送信するためだけにクライアントを作成し、サーバーがそれを出力しました。

メッセージを継続的に受け入れるために do/while ループを配置することを考えていましたが、ループを停止するために何を使用すればよいかわかりません。クライアントに while ループを設定することに注意してください。これは、一定の時間が経過すると停止するように通知されます。その後、その特定のクライアントを閉じる必要があります。サーブに信号がありますが、うまくいくかどうかわかりません。

#include "helper.h"
  char buffer[4096];
void sigchld_handler(int signo)
{
  while (waitpid(-1, NULL, WNOHANG) > 0);
}
void client(int &newsock, int nread)
{
do
            {

                int nread = recv(newsock, buffer,sizeof(buffer), 0);
                     puts(buffer);


            }while(nread!=0);
} 


int main(int argc, char *argv[])
{
    struct sockaddr_in sAddr, cli_addr;
    socklen_t client_len;
    int listensock;
    int newsock;

    int result;
    int nread=1;
     pid_t childid; ;
    int status;

    if((listensock = socket(AF_INET, SOCK_STREAM, 0))<0)
    {
        perror("Problem in creating socket");
        exit(2);
    }


    sAddr.sin_family = AF_INET;
    sAddr.sin_port = htons(3333);
    sAddr.sin_addr.s_addr = htonl(INADDR_ANY);

  bind(listensock, (struct sockaddr *) &sAddr, sizeof(sAddr));
    if (result < 0) {
        perror("exserver2");
        return 0;
    }

    result = listen(listensock, 5);
    if (result < 0) {
        perror("exserver2");
        return 0;
    }

    signal(SIGCHLD, sigchld_handler);

    while (1) {
    client_len = sizeof(cli_addr);
        newsock = accept(listensock,(struct sockaddr *)&cli_addr, &client_len);
        if ((childid = fork()) == 0) {
            printf("child process %i created.\n", getpid());
            close(listensock);
            client(newsock, nread);


            }
            if(status<0)
            {
            printf("%s\n" "Read error");
            exit(1);
            }

            close(newsock);

    }
}
4

2 に答える 2

1

poll(2) (または古い、ほとんど時代遅れのシステムコール) のような多重化システムコールが必要ですselect(2)。いくつかの (または独自の) イベント ループを使用したい場合があります。これその答えを見てください。C10K 問題について読んでください。

すべてのサーバーにはイベント ループが必要です。

Advanced Linux Programming (または Posix ネットワーク プログラミングの本)を読んでください。

于 2013-08-06T07:42:21.083 に答える