客户端/服务器程序中的线程

nun*_*nos 5 c multithreading client-server

对于大学,我正在开发一个本地接力聊天.我必须编写一个聊天服务器和客户端,它只能在具有线程和FIFO的同一台计算机上的不同终端窗口上发送消息.

FIFO部分我没有遇到任何麻烦,线程部分是令我头疼的部分.

服务器有一个线程用于接收来自FIFO(由所有客户端使用)的命令,另一个线程用于连接的每个客户端.

对于每个连接的客户端,我需要知道某些信息.首先,我使用的是全局变量,这个变量很长,因为只有一个客户端连接起来,这很像聊天,单独聊天.

所以,理想情况下我会得到一些数据:

-nickname
-name
-email
-etc ...

每个连接的客户端.但是,我不知道该怎么做.

我可以创建一个client_data [MAX_NUMBER_OF_THREADS],其中client_data是一个结构,包含我需要访问的所有内容,但这需要在服务器和客户端之间的每次通信中请求数组client_data中的客户端的id,并且似乎不太实际

我也可以在创建线程后立即实例化一个client_data,但它只能在该块中使用,这也不是很实用.

如你所见,我需要一点指导.任何评论,一段代码或任何相关信息的链接非常感谢.

小智 1

这是一些实际上几乎可以运行的伪代码。请注意,我不会释放分配的内容,也不会检查错误,我只是想演示如何将结构传递给线程并使用简单的互斥体。

有一点需要注意,线程的函数指针指定一个void *参数,该参数实际上可以是任何类型。在线程中,我们假设将线程参数转换为我们定义的使用类型是安全的。如果您传递多种可能的类型,则必须小心:)

我不太清楚你的程序的结构,或者你如何处理线程,但这里有一个关于如何将数据传递给它们的与方法无关的简短示例:

typedef struct client {
    char *firstname;
    char *lastname;
    char *email;
    char *nickname
} client_t;


pthread_mutex_t client_lock = PTHREAD_MUTEX_INITIALIZER;

void *client_thread(void *threadarg)
{
    client_t *client = (client_t *) threadarg;

    pthread_mutex_lock(&client_lock);
    /* read and write to client structure */
    pthread_mutex_unlock(&client_lock);

    /* do some other stuff */
    pthread_exit(NULL);
}

int main(void)
{
    client_t *client;
    pthread_t cthread;

    client = (client_t *)malloc(sizeof(struct client));
    if (client == NULL)
      return 1;

    client->firstname = strdup("Joe Public");
    /* set the rest of the data */

    pthread_create(&cthread, NULL, (void *)client_thread, (void *)client);
    /* join / detach / etc */

    /* Free all the structure members and the structure itself */

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

我很确定这就是您要问的?