如何使用套接字连续接受来自不同客户端的多条消息? 首先,我用C++编写代码,在Linux/CCENOS 6.4中运行

如何使用套接字连续接受来自不同客户端的多条消息? 首先,我用C++编写代码,在Linux/CCENOS 6.4中运行,c++,linux,sockets,C++,Linux,Sockets,因此,在花了很长时间阅读了很多关于套接字的书籍之后,我终于让我的客户机和服务器部分工作了 首先,我想连续地接受来自不同客户机的消息,我已经设置了客户机,并且最终至少成功地编译了它。现在我需要设置我的服务器,以便能够正确地进行测试 我所做的是用套接字实现就餐哲学家问题,每个客户机/哲学家代表一个不同的过程。我将经历整个过程,服务器将跟踪所有内容,比如所有客户端的状态。这太难了,我现在刚刚创建了客户端,只是为了将它们的状态发送到服务器,服务器将其打印出来 我正在考虑放置一个do/while循环来持续

因此,在花了很长时间阅读了很多关于套接字的书籍之后,我终于让我的客户机和服务器部分工作了

首先,我想连续地接受来自不同客户机的消息,我已经设置了客户机,并且最终至少成功地编译了它。现在我需要设置我的服务器,以便能够正确地进行测试

我所做的是用套接字实现就餐哲学家问题,每个客户机/哲学家代表一个不同的过程。我将经历整个过程,服务器将跟踪所有内容,比如所有客户端的状态。这太难了,我现在刚刚创建了客户端,只是为了将它们的状态发送到服务器,服务器将其打印出来

我正在考虑放置一个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);

    }
}

您需要一个多路复用系统调用,比如旧的、几乎过时的select2syscall。您可能希望使用一些或实现自己的事件循环。请参阅并回答。阅读关于这个问题的文章

每个服务器都需要一个事件循环


阅读或阅读一些Posix网络编程书籍。

您需要一个多路复用系统调用,如或旧的、几乎过时的Select2SYSCAL。您可能希望使用一些或实现自己的事件循环。请参阅并回答。阅读关于这个问题的文章

每个服务器都需要一个事件循环


阅读或阅读一些Posix网络编程书籍。

您可能只需要在tcpserver下运行服务器程序,请参阅。这将在每次客户端在您指定的端口上连接到您的程序时生成一个新的程序实例。这样,您就可以专注于程序的核心逻辑,让tcpserver处理所有繁重的工作,如套接字编程等。tcpserver将把客户端的输入传递到程序的stdin,程序stdout的输出将发送回客户端。

您可能只需要在tcpserver下运行服务器程序,请参阅。这将在每次客户端在您指定的端口上连接到您的程序时生成一个新的程序实例。这样,您可以专注于程序的核心逻辑,让tcpserver处理所有繁重的工作,直到套接字编程等。tcpserver将把客户端的输入传递到程序的stdin,程序stdout的输出将发送回客户端。

如果recv返回零,您需要退出读取循环,你需要使用它返回的长度,而不是将整个缓冲区传递给puts。也许你应该看看select,而不是为每个客户分叉。这个项目需要单独的过程,根据我从所有书籍中读到的内容,select并不能真正做到这一点。我根本不清楚这里的实际问题是什么。@NicholasWilson请阅读问题。他正在为每个已接受的连接分叉一个新流程;在任何情况下,您肯定不需要“在每个套接字程序中都需要一个select循环”。如果recv返回零,您需要退出读取循环,并且您需要使用它返回的长度,而不是将整个缓冲区传递给puts。也许您应该查看select,而不是为每个客户端分叉。项目需要单独的过程,从我从所有的书中读到的内容来看,select并没有真正做到这一点。我根本不清楚这里的实际问题是什么。@NicholasWilson请阅读这个问题。他正在为每个已接受的连接分叉一个新流程;在任何情况下,您肯定不需要“在每个套接字程序中都需要一个select循环”。