Re: complex struct
"John H." <oldman_fromthec@yahoo.com> ha scritto nel messaggio
news:c0811d16-94a8-491c-a610-531eb5fac302@c34g2000yqn.googlegroups.com...
Since you didn't talk much about what you are trying to do, I can only
speculate, but I am guessing that your design here is not doing what
you want it to.
This is what I am tring to do: a tiny streaming server to stream to at least
a couple of clients at the same time. (capturing from a given wave in
device, mp3 encoding and streaming) for the moment I am coding the server
part:
#include <iostream>
#include <string>
#include <map>
#include <algorithm>
#include <process.h>
#include <cstdlib>
#include <ctime>
#include "socket.h"
#include <boost/circular_buffer.hpp>
using namespace std;
using namespace boost;
const string CRLF = "\r\n";
const int numbuff = 3;
const int buflen = 30;
unsigned int __stdcall Consumer(void* sock);
unsigned int __stdcall Producer(void*);
void getDateTime(char * szTime);
struct buffer
{
unsigned char data[1024];
int bytesRecorded;
int user;
buffer(const unsigned char * data_, const int bytesRecorded_, const int
user_) :
bytesRecorded(bytesRecorded_), user(user_)
{
copy(data_, data_ + bytesRecorded_, data);
}
};
struct circular
{
circular_buffer<buffer> cb[numbuff];
circular_buffer<buffer>::const_iterator it;
};
map<int, circular> users;
map<int, circular>::iterator uit;
int main()
{
// Launch Producer
unsigned int prodRet;
_beginthreadex(0,0,Producer,NULL,0,&prodRet);
if(prodRet)
cout << "Launched Producer Thread!" << endl;
// Set up server (port: 8000, maxconn: 10)
SocketServer sockIn(8000, 10);
while(1)
{
// ...wait for incoming connections...
Socket* s = sockIn.Accept();
unsigned int sockRet;
_beginthreadex(0,0,Consumer,s,0,&sockRet);
if(sockRet)
cout << "Spawned a new thread!" << endl;
else
cout << "Thread error!" << endl;
}
sockIn.Close();
system("pause");
return EXIT_SUCCESS;
}
// Consumer
unsigned int __stdcall Consumer(void* sock)
{
Socket* s = (Socket*) sock;
s->SendBytes("Hello World!" + CRLF);
int threadid = (int)GetCurrentThreadId();
// Prepare & add circular buffer to the map
circular c;
c.cb->push_back(buffer(NULL,0,0));
c.cb->push_back(buffer(NULL,0,0));
c.cb->push_back(buffer(NULL,0,0));
users.insert(make_pair(threadid, c));
// TODO:
// Read data from the buffer
// and send it to the client
Sleep(10000);
// Remove buffer from the map
users.erase(threadid);
// Say bye to the client
s->SendBytes("Bye bye!" + CRLF);
// Disconnect client
cout << "Closing thread..." << endl;
s->Close();
delete s;
return 0;
}
// Producer
unsigned int __stdcall Producer(void*)
{
while(1)
{
Sleep(1000);
char szTime[30]; getDateTime(szTime);
for(uit=users.begin(); uit!=users.end(); ++uit)
{
users[uit->first].cb->push_back(buffer((unsigned char*)szTime, 30, 1));
cout << "Producer is writing to: " << uit->first << endl;
}
}
return 0;
}
void getDateTime(char * szTime)
{
time_t rawtime = time(NULL);
struct tm timeinfo;
gmtime_s(&timeinfo, &rawtime);
strftime(szTime, 30, "%a, %d %b %Y %X GMT", &timeinfo);
}
thanks