Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 7 Apr 2001 01:17:46 -0400
From:      "Brian M. King" <raider1@rochester.rr.com>
To:        <freebsd-questions@FreeBSD.ORG>
Subject:   C++
Message-ID:  <000b01c0bf22$14f70460$0d6e1842@King.rochester.rr.com>

next in thread | raw e-mail | index | archive | help

[-- Attachment #1 --]


[-- Attachment #2 --]
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <map>
#include <queue>
#include <fcntl.h>

void *queue_handler(void *);
void *read_data(void *);

#define SUCCESS 0
#define ERROR   1

#define END_LINE 0x0A
#define SERVER_PORT 1600
#define MAX_MSG 1

queue<char *> MessageQueue;
map<int,int> SockMap;
map<int,int>::iterator iter;

int sd, i = 0, x = 0;
socklen_t cliLen;
pthread_t mt;
pthread_t qh1, qh2, qh3, qh4, qh5;
pthread_mutex_t mutex;
char *line;
struct sockaddr_in cliAddr, servAddr;

int main () {
   pthread_mutex_init(&mutex, pthread_mutexattr_default);
   sd = socket(AF_INET, SOCK_STREAM, 0);
   if (sd < 0) {
      perror("cannot open socket ");
      return ERROR;
   }
  
   servAddr.sin_family = AF_INET;
   servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
   servAddr.sin_port = htons(SERVER_PORT);
  
   if (bind(sd, (struct sockaddr *) &servAddr, sizeof(servAddr))<0) {
      perror("cannot bind port ");
      return ERROR;
   }

   listen(sd,5);
   printf("Waiting for data on port TCP %u\n",SERVER_PORT);

   pthread_create(&mt, NULL, read_data, NULL);
   pthread_create(&qh1, NULL, queue_handler, NULL);
   pthread_create(&qh2, NULL, queue_handler, NULL);
   pthread_create(&qh3, NULL, queue_handler, NULL);
   pthread_create(&qh4, NULL, queue_handler, NULL);
   pthread_create(&qh5, NULL, queue_handler, NULL);

   while (1) {
      cliLen = sizeof(cliAddr);
      if ((SockMap[i] = accept(sd, (struct sockaddr *) &cliAddr, &cliLen)) != -1) {
         fcntl(SockMap[i], F_SETFL, O_NONBLOCK);
         printf("Got a connection\n");
         i++;
      }
   }
   return 1;
}

void *read_data(void *)
{
   char buf[1025];

   map<int,char *> flack;
   while (1) {
      for (iter = SockMap.begin(); iter != SockMap.end(); iter++) {
         if (iter->second != 0) {
            memset(buf, 0, 1025);
            int size = recv(iter->second, buf, 1024, MSG_DONTWAIT);

            if (size) {
               char *s, *e;
               s = buf;
               while ((e = strchr(s, '\n')) != NULL) {
                  *e = 0;
                  if (flack.find(iter->second) != flack.end() && flack[iter->second] != NULL) {
                     flack[iter->second] = (char *) realloc(flack[iter->second], strlen(flack[iter->second]) + strlen(s) + 1);
                     strcat(flack[iter->second], s);
                     char *msg = (char *)malloc(strlen(flack[iter->second]) + 1);  
                     strcpy(msg, flack[iter->second]);
                     pthread_mutex_lock(&mutex);   
                     MessageQueue.push(flack[iter->second]);
                     pthread_mutex_unlock(&mutex);
                     free(flack[iter->second]);
                     flack.erase(iter->second);
                  } else {
                     char *msg = (char *)malloc(strlen(s) + 1);  
                     strcpy(msg, s);
                     pthread_mutex_lock(&mutex);
                     MessageQueue.push(s);
                     pthread_mutex_unlock(&mutex);
                  }
                  s = ++e;
               }
               if (*s != 0) {
                  if (flack.find(iter->second) != flack.end()) {
                     flack[iter->second] = (char *) realloc(flack[iter->second], strlen(flack[iter->second]) + strlen(s) + 1);
                     strcat(flack[iter->second], s);
                  } else {
                     flack[iter->second] = (char *) malloc(strlen(s) + 1);
                     strcpy(flack[iter->second], s);
                  }
               }
            }
         }
      }
      sleep(1);
   }
   return NULL;
}
void *queue_handler(void *)
{
   while (1) {    
      char *msg = NULL;
      pthread_mutex_lock(&mutex);
      if (MessageQueue.size()) { 
         msg = MessageQueue.front();   
         MessageQueue.pop(); 
      }
      pthread_mutex_unlock(&mutex);
      if (msg != NULL) {
         //do_processing();   
         free(msg);  
      }
   }
}

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?000b01c0bf22$14f70460$0d6e1842>