如何从服务器中的某些数据写入连接到服务器的所有客户端?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从服务器中的某些数据写入连接到服务器的所有客户端?相关的知识,希望对你有一定的参考价值。

我有一个小问题,但找不到任何解决方案。我有此代码。

服务器代码

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <pthread.h>

#define PORT 2908
extern int errno;

typedef struct thData{
    int idThread; 
    int cl; 
}thData;

static void *treat(void *); 
void raspunde(void *);

int main ()
{
  struct sockaddr_in server;    
  struct sockaddr_in from;  
  int nr;       
  int sd;       
  int pid;
  pthread_t th[100];
    int i=0;



  if ((sd = socket (AF_INET, SOCK_STREAM, 0)) == -1)
    {

      return errno;
    }
  int on=1;
  setsockopt(sd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));

  bzero (&server, sizeof (server));
  bzero (&from, sizeof (from));

    server.sin_family = AF_INET;    
    server.sin_addr.s_addr = htonl (INADDR_ANY);
    server.sin_port = htons (PORT);

  /
  if (bind (sd, (struct sockaddr *) &server, sizeof (struct sockaddr)) == -1)
    {

      return errno;
    }


  if (listen (sd, 2) == -1)
    {
      perror ("[server]Error at listen().
");
      return errno;
    }

  while (1)
    {
      int client;
      thData * td;     
      int length = sizeof (from);


      fflush (stdout);


      if ( (client = accept (sd, (struct sockaddr *) &from, &length)) < 0)
    {
      perror ("[server]Error at accept().
");
      continue;
    }

    td=(struct thData*)malloc(sizeof(struct thData));   
    td->idThread=i++;
    td->cl=client;

    pthread_create(&th[i], NULL, &treat, td);         

    }//while    
};              
static void *treat(void * arg)
{       
        struct thData tdL; 
        tdL= *((struct thData*)arg);    
        printf ("[thread]- %d - Waiting the message...
", tdL.idThread);
        fflush (stdout);         
        pthread_detach(pthread_self());     
        raspunde((struct thData*)arg);
        close ((intptr_t)arg);
        return(NULL);   

};


void raspunde(void *arg)
{
        int nr, i=0;
    struct thData tdL; 
    tdL= *((struct thData*)arg);
    if (read (tdL.cl, &nr,sizeof(int)) <= 0)
            {
              printf("[Thread %d]
",tdL.idThread);
              perror ("Error at read() from client.
");

            }

    printf ("[Thread %d]The message is...%d
",tdL.idThread, nr);


              nr++;      
    printf("[Thread %d]Sending the message back...%d
",tdL.idThread, nr);

        printf("%d
",tdL.cl );
     if (write (tdL.cl, &nr, sizeof(int)) <= 0)
        {
         printf("[Thread %d] ",tdL.idThread);
         perror ("[Thread]Error at write() from client.
");
        }
    else
        printf ("[Thread %d]The message was sent.
",tdL.idThread); 

}

上面的代码是一个为每个客户端创建线程的服务器。客户端向服务器发送一个号码,服务器将以数字加1的方式回复给客户端。

问题是,如何将响应函数中的nr或字符串消息写至服务器上连接的所有客户端?

谢谢您!

我有一个小问题,但找不到任何解决方案。我有这个代码。服务器代码#include #include #include #include ...

答案

如评论中所指出,您必须保留一个活动线程列表(受互斥锁保护!),才能知道谁连接到您的服务器。创建线程时,它将被添加到列表中,执行完成后,它将被删除。因此,您可以进行以下更改:

以上是关于如何从服务器中的某些数据写入连接到服务器的所有客户端?的主要内容,如果未能解决你的问题,请参考以下文章

C# 如何向连接到我的服务器的所有客户端发送数据?

AsyncSocket 可以连接到 java Socket 服务器但不能写入数据

如何从 C# 连接到 HyperSQL DB

如何从另一台计算机连接到JavaDB?

JDBC 无法连接到某些 WiFi 的 Azure 服务器:允许所有 IP

当我将多个客户端同时连接到 Java 服务器时,套接字写入错误