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>
