#include <marnet.h>
Public Types | |
typedef MarXF | inherited |
Public Member Functions | |
MarNet (QObject *parent) | |
int | net_open (int sk) |
int | net_close (int sk) |
int | net_data () |
int | net_comm (int mode, char *buf) |
int | net_select (int sk) |
int | net_stat () |
int | net_msg () |
virtual int | process_status (char *buf)=0 |
virtual void | print_msg (char *s)=0 |
Static Private Member Functions | |
static void | stop_net (int signo) |
typedef MarXF MarNet::inherited |
Reimplemented from MarXF.
Reimplemented in Command, MarClock, MarHW, MarStartup, QScan345Controller, and Scan345.
MarNet::MarNet | ( | QObject * | parent | ) |
Definition at line 65 of file marnet.cpp.
: inherited(parent) { }
int MarNet::net_close | ( | int | sk | ) |
Definition at line 178 of file marnet.cpp.
References mar_socket, and netcontrol.
Referenced by MarHW::mar_quit(), and MarHW::mar_servo().
{ if ( mar_socket[sk] < 0 || netcontrol < 1 ) return 0; close ( mar_socket[sk] ); mar_socket[sk] = -1; return 1; }
int MarNet::net_comm | ( | int | mode, |
char * | buf | ||
) |
Definition at line 295 of file marnet.cpp.
References FD_MAX, i, j, mar_socket, net_timeout, netcontrol, SK_COMM, swaplong(), and timeout.
Referenced by MarHW::mar_command().
{ int i,j,nwrite,fail=0; int sel; fd_set r; if ( mar_socket[SK_COMM] < 0 || netcontrol < 1 ) return -1; /* Check that we can write to socket ... */ FD_ZERO( &r ); FD_SET ( mar_socket[SK_COMM], &r ); if ( mode == 0 ) /* Something to read on socket ? */ sel = select(FD_MAX,&r,(fd_set *)0,(fd_set *)0,&timeout); else /* Something to write on socket ? */ sel = select(FD_MAX,(fd_set *)0,&r,(fd_set *)0,&timeout); if ( sel < 0 ) return -1; /* There are data to read on socket: USER PARAMETERS */ if ( mode == 0 ) { return 64; nwrite = 0; while ( ( i=read(mar_socket[SK_COMM], buf, 64)) > 0 ) { nwrite += i; } return nwrite; } net_timeout = 0; i = nwrite = 0; j = 60; #if ( __linux__ || __osf__ ) swaplong( buf+4, sizeof(char)*28 ); #endif while ( nwrite<j ) { i=write(mar_socket[SK_COMM], buf+nwrite, j); if ( i < 1 ) { fail++; if ( fail > 100 ) { net_timeout++; return -1; } continue; } nwrite+=i; j -=i; } return nwrite; }
int MarNet::net_data | ( | ) |
Definition at line 190 of file marnet.cpp.
References bytes2xfer, DATA_SIZE, debug, FD_MAX, i, ict1, ict2, j, mar_socket, maximum_bytes, net_buf, netcontrol, scan_in_progress, SK_DATA, stat_blocks_scanned, stat_blocks_sent, swapshort(), timeout, and MarXF::Transform().
Referenced by MarHW::get_status(), and QScan345Controller::poll_status().
{ static int p_pixels= 9999; static int size = DATA_SIZE; static int tot_pix = 0; static int nbeg = 0; int nend = 0; int nread = 0; int ncop = 0; int ioff = 0; int j = 0; int i,n; char *buf_ptr; char rbuf[ DATA_SIZE ]; fd_set r; static unsigned short block_no; extern int stat_blocks_scanned; extern int stat_blocks_sent; extern int ict1,ict2; extern int bytes2xfer,maximum_bytes; ict1++; if ( mar_socket[SK_DATA] < 0 || netcontrol < 1 ) return 0; FD_ZERO( &r ); FD_SET ( mar_socket[SK_DATA], &r ); i = select(FD_MAX,&r,(fd_set *)0,(fd_set *)0,&timeout); if ( i < 1 ) return (-2); /* Read from socket */ nread = read(mar_socket[SK_DATA], rbuf, size); if ( nread<1 ) return -1; bytes2xfer += nread; /* Increase pointer for end of this chunk of data */ nend = nbeg+nread; /* Make sure that we dont exceed 16386 kB */ if ( nend > DATA_SIZE) { ioff = nend-DATA_SIZE; ncop = nread - ioff; nend = DATA_SIZE; } else { ioff = 0; ncop = nread; } /* Copy latest data into net_buf (16kB block) */ memcpy( net_buf + nbeg, rbuf, ncop ); #ifdef DEBUG if (debug & 0x200 ) printf("scan345: net_data %5d block=%4d\n",nread,block_no); #endif /* Increase pointer for begin of next chunk of data */ nbeg += ncop; /* Block not yet finished: read more data */ if ( nend < 16386 ) { block_no = stat_blocks_sent; return nread; } /* Block of data finished: transform it ... */ #if ( __linux__ || __osf__ ) swapshort( (char *)net_buf, nend); #endif ict2++; /* Start of data block: get block no from first 2 bytes */ memcpy( &block_no, net_buf, sizeof(short) ); stat_blocks_sent = block_no; buf_ptr = net_buf+2; n = (DATA_SIZE-2)/2; tot_pix += n; /* Transform ... */ if ( scan_in_progress ) Transform( n, block_no, (unsigned short *)buf_ptr); nbeg = 0; /* This time, there are still some data in rbuf that we can't * loose. Copy into start of net_buf */ if ( ioff ) { memcpy( net_buf, rbuf+ncop, ioff); nbeg = ioff; ioff = 0; } return nread; }
int MarNet::net_msg | ( | ) |
Definition at line 443 of file marnet.cpp.
References mar_socket, MESS_SIZE, msg_buf, net_timeout, netcontrol, print_msg(), and SK_MESS.
Referenced by MarHW::get_status(), and QScan345Controller::poll_status().
{ int sel; fd_set r; if ( mar_socket[SK_MESS] < 0 || netcontrol < 1 || net_timeout ) return 0; /* We can't accumulate messages in the port, so always try to read * as much as possible */ while ( 1 ) { sel = read(mar_socket[SK_MESS], msg_buf, MESS_SIZE); if ( sel < 1 ) break; print_msg( msg_buf ); } return sel; }
int MarNet::net_open | ( | int | sk | ) |
Definition at line 74 of file marnet.cpp.
References i, mar_host, mar_port, mar_socket, MAX_TRY, MarXF::print_message(), sk_type, stop_net(), stop_trying, and timeout.
Referenced by MarStartup::marStartup().
{ int i,retry=0; int protocol; int new_socket; struct sockaddr_in sin; struct sockaddr* sinPtr; struct hostent *hp=NULL; extern int mar_port; extern char mar_host[32]; /* Get host address */ hp = gethostbyname(mar_host); if (hp == NULL) { return(0); } if ( strlen( mar_host ) < 1 ) return 0; if ( mar_socket[sk] != -1 ) { close( mar_socket[sk] ); mar_socket[sk] = -1; } /* Set timeout for socket op's */ timeout.tv_sec = 0; timeout.tv_usec = 0; /***************************************************** * Create a socket: try 10 times *****************************************************/ protocol = getprotobyname("tcp")->p_proto; signal( SIGINT, stop_net); stop_trying = 0; while ( retry < MAX_TRY ) { if ( stop_trying ) { retry = MAX_TRY; break; } new_socket = socket(AF_INET, SOCK_STREAM, protocol); if ( new_socket < 0 ) { fprintf( stdout, "scan345: Cannot open socket %s at port %d\n",sk_type[sk],mar_port+sk); return(0); } /***************************************************** * Connect to the server. *****************************************************/ sin.sin_family = AF_INET; sin.sin_port = htons(mar_port+sk); bcopy (hp->h_addr, &(sin.sin_addr.s_addr), hp->h_length); sinPtr = (struct sockaddr *)&sin; if ( ::connect(new_socket, sinPtr, sizeof(sin)) < 0) { fprintf(stdout, "scan345: %d. try to connect to host '%s' ...\n",retry,mar_host); if ( retry%5 == 0 ) fprintf(stdout, " To interrupt, press Ctrl+C\n"); sleep( 1 ); close( new_socket ); retry++; } else break; } // signal( SIGINT, mar_kill); // signal( SIGKILL, mar_kill ); // signal( SIGTERM, mar_kill ); // signal( SIGQUIT, mar_abort); if ( retry >= MAX_TRY ) { fprintf(stdout, "scan345: Giving up ...\n"); close(new_socket); new_socket = -1; return 0; } // fprintf(stdout,"scan345: Connected to host '%s' on port %d (%s)\n",mar_host,mar_port+sk,sk_type[sk]); emit print_message(tr("scan345: Connected to host '%1' on port %2 (%3)\n").arg(mar_host).arg(mar_port+sk).arg(sk_type[sk])); /* We don't need the previous socket any more, close it */ if ( mar_socket[sk] != -1 ) close( mar_socket[sk] ); mar_socket[sk] = new_socket; /* Set socket NON BLOCKING */ if ( fcntl( mar_socket[sk], F_SETFL, O_NONBLOCK ) < 0 ) { fprintf(stdout,"scan345: Socket %s cannot be set to NON BLOCKING\n",sk_type[sk]); } return 1; }
int MarNet::net_select | ( | int | sk | ) |
Definition at line 353 of file marnet.cpp.
References FD_MAX, mar_socket, netcontrol, and timeout.
{ int sel; fd_set r; if ( mar_socket[sk] < 0 || netcontrol < 1 ) return -1; FD_ZERO( &r ); FD_SET ( mar_socket[sk], &r ); sel = select(FD_MAX,(fd_set *)0,&r,(fd_set *)0,&timeout); if ( sel < 0 ) return -1; return sel; }
int MarNet::net_stat | ( | ) |
Definition at line 385 of file marnet.cpp.
References debug, FD_MAX, i, j, mar_socket, net_timeout, netcontrol, process_status(), SK_STAT, STAT_SIZE, swaplong(), and timeout.
Referenced by MarHW::get_status(), and QScan345Controller::poll_status().
{ register unsigned int j; static char s1buf[STAT_SIZE]; int nread,i,size,sel; time_t t1, t2; fd_set r; if ( mar_socket[SK_STAT] < 0 || netcontrol < 1 || net_timeout ) return 0; /* Check that we can read from socket ... */ FD_ZERO( &r ); FD_SET ( mar_socket[SK_STAT], &r ); sel = select(FD_MAX,&r,(fd_set *)0,(fd_set *)0,&timeout); if ( sel < 1 ) return sel; size = STAT_SIZE; nread = 0; j = 0; t1 = time(NULL); while ( nread < STAT_SIZE ) { j++; i = read(mar_socket[SK_STAT], s1buf+nread, size); if ( j > 10000000 ) { t2 = time(NULL); if ( difftime( t2, t1 ) > 5.0 ) break; continue; } if ( i < 0 ) continue; nread += i; size -= i; } #ifdef DEBUG if (debug & 0x800 ) printf("scan345: net_stat %d\n",i); #endif #if ( __linux__ || __osf__ ) swaplong( s1buf, (int)STAT_SIZE); #endif if ( nread >= STAT_SIZE ) i = process_status( s1buf+4 ); else { fprintf( stdout, "scan345: Only %d bytes in status block !!!\n",nread); } return nread; }
virtual void MarNet::print_msg | ( | char * | s | ) | [pure virtual] |
virtual int MarNet::process_status | ( | char * | buf | ) | [pure virtual] |
Implemented in MarHW.
Referenced by net_stat().
void MarNet::stop_net | ( | int | signo | ) | [static, private] |
Definition at line 375 of file marnet.cpp.
References stop_trying.
Referenced by net_open().
{ printf( "scan345: signal SIGINT caught\n"); stop_trying = 1; }