55 #include <sys/socket.h>
72 ShmemSocket::ShmemSocket(QObject *parent)
89 ShmemSocket::~ShmemSocket()
91 delete[] filter_kinds;
103 struct sockaddr_un from;
119 if (m_iShmemSock < 0)
125 fromlen =
sizeof(from);
126 rlen = recvfrom(m_iShmemSock, (
void *)(&mess), DATA_MESS_SIZE, 0, (sockaddr *)(&from), &fromlen);
136 this->close_socket ();
142 if (mess.kind > 20000 || (
unsigned long) mess.size > (
size_t) 100000000)
144 printf(
"ALERT: Unreasonable data received, skipping! (size=%d)(kind=%d)", mess.kind, mess.size);
147 mess.kind = FIFF_NOP;
150 p_pTag->kind = mess.kind;
151 p_pTag->type = mess.type;
154 if ((
unsigned long) mess.size > (
size_t) 0)
156 p_pTag->resize(mess.size);
161 if (mess.loc < 0 && (
unsigned long) mess.size > (
size_t) 0 && mess.shmem_buf < 0 && mess.shmem_loc < 0)
163 fromlen =
sizeof(from);
164 rlen = recvfrom(m_iShmemSock, (
void *)p_pTag->data(), mess.size, 0, (sockaddr *)(&from), &fromlen);
168 this->close_socket();
175 else if ((
unsigned long) mess.size > (
size_t) 0) {
179 if (mess.shmem_buf >= 0 && m_iShmemId/10000 > 0)
181 shmBlock = shmem + mess.shmem_buf;
182 shmClient = shmBlock->clients;
184 if (interesting_data(mess.kind))
186 memcpy(p_pTag->data(),shmBlock->data,mess.size);
189 printf(
"client # %d read shmem buffer # %d\n", m_iShmemId, mess.shmem_buf);
195 for (k = 0; k < SHM_MAX_CLIENT; k++,shmClient++)
196 if (shmClient->client_id == m_iShmemId)
206 if (m_iShmemId/10000 > 0 && mess.shmem_loc >= 0) {
208 read_loc = mess.shmem_loc;
214 if (interesting_data(mess.kind)) {
215 if (read_fif (read_fd,read_loc,mess.size,(
char *)p_pTag->data()) == -1) {
216 printf(
"Could not read data (tag = %d, size = %d, pos = %li)!\n", mess.kind,mess.size,read_loc);
232 if (mess.kind == FIFF_CLOSE_FILE) {
234 printf(
"File to be closed (lib/FIFF_CLOSE_FILE).\n");
239 printf(
"No file to close (lib/FIFF_CLOSE_FILE).\n");
244 else if (mess.kind == FIFF_NEW_FILE) {
247 printf(
"File closed (lib/FIFF_NEW_FILE).\n");
249 fd = open_fif((
char *)p_pTag->data());
251 filename = strdup((
char *)p_pTag->data());
253 if (shmem_fd == NULL)
254 shmem_fd = open_fif (SHM_FAIL_FILE);
257 if (p_pTag->size() <= 0)
268 FILE *ShmemSocket::open_fif (
char *name)
272 printf(
"Open %s... ",name);
274 if ((fd = fopen(name,
"r")) == NULL) {
275 printf (
"failed!\r\n");
279 printf (
"[done]\r\n");
287 int ShmemSocket::read_fif (FILE *fd,
long pos,
size_t size,
char *data)
290 printf(
"Cannot read from NULL fd.");
293 if (fseek(fd,pos,SEEK_SET) == -1) {
297 if (fread(data,size,1,fd) != (
size_t) 1) {
298 printf(
"Data not available.");
307 bool ShmemSocket::connect_client ()
309 printf(
"About to connect to the Neuromag DACQ shared memory on this workstation (client ID %d)... ", m_iShmemId);
313 struct sockaddr_un clntaddr;
314 char client_path[200];
317 sprintf (client_path,
"%s%d",SOCKET_PATHCLNT,
id);
321 (void)unlink(client_path);
325 if ((sock = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0) {
327 printf(
"socket error");
336 bzero(&clntaddr,
sizeof(clntaddr));
337 clntaddr.sun_family = AF_UNIX;
338 strcpy(clntaddr.sun_path, client_path);
340 if (bind(sock, (sockaddr *)(&clntaddr),
sizeof(clntaddr)) < 0) {
343 printf(
"bind error");
348 if (connect_disconnect(sock,
id) == FAIL)
358 printf(
"[done]\r\n");
365 int ShmemSocket::disconnect_client ()
367 int sock = m_iShmemSock;
370 int result = connect_disconnect(sock,-
id);
371 this->close_socket ();
378 void ShmemSocket::set_data_filter (
int *kinds,
int nkind)
382 delete[] filter_kinds;
388 delete[] filter_kinds;
389 filter_kinds =
new int[nfilt];
390 memcpy(filter_kinds,kinds,nfilt*
sizeof(
int));
398 void ShmemSocket::close_socket ()
400 int sock = m_iShmemSock;
404 char client_path[200];
411 sprintf (client_path,
"%s%d",SOCKET_PATHCLNT,
id);
415 (void) release_shmem();
417 printf (
"Connection closed.\r\n");
423 int ShmemSocket::connect_disconnect (
int sock,
int id)
425 struct sockaddr_un servaddr;
426 struct sockaddr_un from;
437 bzero(&servaddr,
sizeof(servaddr));
438 servaddr.sun_family = AF_UNIX;
439 strcpy(servaddr.sun_path, SOCKET_PATH);
441 slen = sendto(sock, (
void *)(&
id),
sizeof(
int), 0,
442 (sockaddr *)(&servaddr),
sizeof(servaddr));
444 printf(
"sendto error");
445 this->close_socket ();
449 fromlen =
sizeof(from);
450 rlen = recvfrom(sock, (
void *)(&result),
sizeof(
int), 0,
451 (sockaddr *)(&from), &fromlen);
454 this->close_socket ();
465 int ShmemSocket::interesting_data (
int kind)
468 for (k = 0; k < nfilt; k++)
469 if (kind == filter_kinds[k])
482 if (init_shmem() == -1)
491 int ShmemSocket::init_shmem()
493 key_t key = ftok(SHM_FILE,
'A');
496 if ((shmid = shmget(key,SHM_SIZE,IPC_CREAT | 0666)) == -1) {
501 if (shmptr == NULL) {
514 int ShmemSocket::release_shmem()
518 if (shmptr != NULL) {
519 if (shmdt(shmptr) == -1) {
QSharedPointer< FiffTag > SPtr
static void convert_tag_data(FiffTag::SPtr tag, int from_endian, int to_endian)
implementation of the ShmemSocket Class.