C 如何将消息从一个客户端发送到所有连接的客户端?(是否可以将集合发送到客户端,或者在线程和主线程之间共享此信息?@ThomasVerbeke首先,您必须跟踪所有线程,例如在列表中。然后每个线程都有一个消息队列,当一个线程收到消息时,将副本放入另一个线程的消息

C 如何将消息从一个客户端发送到所有连接的客户端?(是否可以将集合发送到客户端,或者在线程和主线程之间共享此信息?@ThomasVerbeke首先,您必须跟踪所有线程,例如在列表中。然后每个线程都有一个消息队列,当一个线程收到消息时,将副本放入另一个线程的消息,c,select,tcp,pthreads,recv,C,Select,Tcp,Pthreads,Recv,如何将消息从一个客户端发送到所有连接的客户端?(是否可以将集合发送到客户端,或者在线程和主线程之间共享此信息?@ThomasVerbeke首先,您必须跟踪所有线程,例如在列表中。然后每个线程都有一个消息队列,当一个线程收到消息时,将副本放入另一个线程的消息队列中。然后每个线程都会检查它。)s自己的消息发送队列。请记住使用类似mutex.thx的东西来保护队列;您的答案最终对我帮助最大:它以以下方式工作;我有一个动态数组列表,其中我将一个连接的客户端列表与套接字描述符放在一起。在服务器线程内(做点


如何将消息从一个客户端发送到所有连接的客户端?(是否可以将集合发送到客户端,或者在线程和主线程之间共享此信息?@ThomasVerbeke首先,您必须跟踪所有线程,例如在列表中。然后每个线程都有一个消息队列,当一个线程收到消息时,将副本放入另一个线程的消息队列中。然后每个线程都会检查它。)s自己的消息发送队列。请记住使用类似mutex.thx的东西来保护队列;您的答案最终对我帮助最大:它以以下方式工作;我有一个动态数组列表,其中我将一个连接的客户端列表与套接字描述符放在一起。在服务器线程内(做点什么)我让Receive阻塞,直到它得到输入,然后使用列表中的套接字描述符将此输入发送到所有连接的客户端。在客户端内部有一个线程侦听和一个线程发送;工作正常!thx againI必须使用线程(这不是因为系统;linux)但是,因为在分配中,每个客户端都必须有一个线程。我特别遇到的问题是,只有主线程可以将每个线程中从每个客户端接收到的数据发送给所有客户端,因为只有主线程可以访问包含套接字描述符的集合。您说过使用管道处理消息就是这样也许可以只在主线程和线程之间通信集合?嗨,托马斯,所以你要做的是让服务器侦听(添加到选择FDSET)到每个管道的读取端,从客户端读取的线程将从客户端接收到的数据写入各自管道的写入端。当客户端线程接收到数据时,它只将数据写入其管道。当服务器在其中一个客户端管道上接收到数据时,它将数据发送给所有其他客户端。希望这有帮助!耶s使用消息队列可能会做到这一点,但传递集合不是更好吗?
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include "tcp_comm.h"
#include <sys/time.h>
#include <sys/types.h>

#define BUFSIZE 1024
#define PORT 1234

void *do_something(void *a);

int main (void){
    Socket server = tcp_passive_open( PORT );
    MySocket *s = (MySocket *)server;
    printf("Server socked_id (main): %i", s->sd);

    pthread_t thread;

    fd_set active_socketDescriptors,read_socketDescriptors;

    FD_ZERO(&active_socketDescriptors);         
    FD_SET(s->sd,&active_socketDescriptors);    

    while (1){
        read_socketDescriptors = active_socketDescriptors;
        if (select (FD_SETSIZE, &read_socketDescriptors, NULL, NULL, NULL) < 0){
            perror ("select"); 
            exit (EXIT_FAILURE);
        }

        int i;
        for (i = 0; i < FD_SETSIZE; ++i){
            if (FD_ISSET (i, &read_socketDescriptors)){
                if (i == s->sd){
                    Socket client = tcp_wait_for_connection( server ); 
                    pthread_create (&thread,NULL, do_something, (void *)client); 
                    FD_SET (s->sd, &active_socketDescriptors);          
                } else {
                }
            }
        }
    }

    tcp_close( server );
    return 0;

}
void *do_something(void *client){
    unsigned char input[BUFFER_SIZE]; 
    pthread_detach(pthread_self());

    MySocket *s = (MySocket *)client;
    printf("Client socked_id (thread): %i", s->sd);
    int j;
    while (1){
        int nbytes = tcp_receive(client, input, BUFSIZE );
        if (nbytes <= 0){
                if (nbytes ==0){
                    /* connection closed by client*/    
                    printf("Client closed connection");         
                } else {
                    /* other error*/
                    perror("tcp_receive");              
                }
                tcp_close(&client);
                /*remove the socket descriptor from set in the main BRAINSTORM ABOUT THIS */
        } else {
            /*data incoming */
            printf("\nMessage from client: %s",input);
        }
    }
    return 0;
}
for (j=0; j<=FD_SETSIZE;j++){
    if(FD_ISSET(j,&active_socketDescriptors)){
        if (j != s.thead && j!=s.main){
            tcp_send(j, (void*)input,nbytes);
        }       
    }   
}