mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-04-22 03:40:04 +02:00

git-svn-id: file:///afs/psi.ch/project/sls_det_software/svn/slsDetectorSoftware@222 951219d9-93cf-4727-9268-0efd64621fa3
478 lines
10 KiB
C
Executable File
478 lines
10 KiB
C
Executable File
|
|
|
|
#include "communication_funcs.h"
|
|
//#include <sys/socket.h>
|
|
#include <netinet/tcp.h> /* for TCP_NODELAY */
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
#include <errno.h>
|
|
|
|
|
|
|
|
|
|
//int socketDescriptor, file_des;
|
|
const int send_rec_max_size=SEND_REC_MAX_SIZE;
|
|
extern int errno;
|
|
|
|
|
|
char dummyClientIP[INET_ADDRSTRLEN];
|
|
|
|
//struct sockaddr_in address;
|
|
//#define VERBOSE
|
|
|
|
|
|
int bindSocket(unsigned short int port_number) {
|
|
int i;
|
|
|
|
struct sockaddr_in addressS;
|
|
int socketDescriptor;
|
|
//int file_des;
|
|
|
|
//file_des= -1;
|
|
socketDescriptor = socket(AF_INET, SOCK_STREAM,0); //tcp
|
|
|
|
//socketDescriptor = socket(PF_INET, SOCK_STREAM, 0);
|
|
|
|
|
|
|
|
if (socketDescriptor < 0) {
|
|
printf("Can not create socket\n");
|
|
} else {
|
|
|
|
i = 1;
|
|
setsockopt(socketDescriptor, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));
|
|
// setsockopt(socketDescriptor, IPPROTO_TCP, TCP_NODELAY, (char *) &i, sizeof(i));
|
|
// TCP_CORK
|
|
|
|
// Set some fields in the serverAddress structure.
|
|
addressS.sin_family = AF_INET;
|
|
addressS.sin_addr.s_addr = htonl(INADDR_ANY);
|
|
addressS.sin_port = htons(port_number);
|
|
|
|
// memset(&address.sin_addr, 0, sizeof(address.sin_addr));
|
|
|
|
|
|
if(bind(socketDescriptor,(struct sockaddr *) &addressS,sizeof(addressS))<0){
|
|
|
|
printf("Can not create socket\n");
|
|
|
|
socketDescriptor=-1;
|
|
} else {
|
|
listen(socketDescriptor, 5);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//int getrlimit(int resource, struct rlimit *rlim);
|
|
|
|
|
|
|
|
return socketDescriptor;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int getServerError(int socketDescriptor)
|
|
{
|
|
if (socketDescriptor<0) return 1;
|
|
else return 0;
|
|
};
|
|
|
|
|
|
int acceptConnection(int socketDescriptor) {
|
|
struct sockaddr_in addressC;
|
|
int file_des=-1;
|
|
|
|
//socklen_t address_length;
|
|
size_t address_length=sizeof(struct sockaddr_in);
|
|
|
|
// if(file_des>0) return file_des;
|
|
|
|
//#ifndef C_ONLY
|
|
// if(is_a_server){ //server; the server will wait for the clients connection
|
|
//#endif
|
|
|
|
|
|
if (socketDescriptor>0) {
|
|
//if ((file_des = accept(socketDescriptor,(struct sockaddr *) &address, &address_length)) < 0) {
|
|
if ((file_des = accept(socketDescriptor,(struct sockaddr *) &addressC, &address_length)) < 0) {
|
|
|
|
|
|
printf("Error: with server accept, connection refused %d\n", errno);
|
|
|
|
|
|
switch(errno) {
|
|
case EWOULDBLOCK:
|
|
printf("ewouldblock eagain\n");
|
|
break;
|
|
case EBADF:
|
|
printf("ebadf\n");
|
|
break;
|
|
case ECONNABORTED:
|
|
printf("econnaborted\n");
|
|
break;
|
|
case EFAULT:
|
|
printf("efault\n");
|
|
break;
|
|
case EINTR:
|
|
printf("eintr\n");
|
|
break;
|
|
case EINVAL:
|
|
printf("einval\n");
|
|
break;
|
|
case EMFILE:
|
|
printf("emfile\n");
|
|
break;
|
|
case ENFILE:
|
|
printf("enfile\n");
|
|
break;
|
|
case ENOTSOCK:
|
|
printf("enotsock\n");
|
|
break;
|
|
case EOPNOTSUPP:
|
|
printf("eOPNOTSUPP\n");
|
|
break;
|
|
case ENOBUFS:
|
|
printf("ENOBUFS\n");
|
|
break;
|
|
case ENOMEM:
|
|
printf("ENOMEM\n");
|
|
break;
|
|
case ENOSR:
|
|
printf("ENOSR\n");
|
|
break;
|
|
case EPROTO:
|
|
printf("EPROTO\n");
|
|
break;
|
|
default:
|
|
printf("unknown error\n");
|
|
}
|
|
|
|
|
|
socketDescriptor=-1;
|
|
}
|
|
inet_ntop(AF_INET, &(addressC.sin_addr), dummyClientIP, INET_ADDRSTRLEN);
|
|
|
|
|
|
|
|
|
|
// struct sockaddr_in
|
|
//{
|
|
//short int sin_family; /* Famyly of the address*/
|
|
//unsigned short int sin_port; /* Port */
|
|
//struct in_addr sin_addr; /* Network address */
|
|
//unsigned char sin_zero[8]; /* Same size of struct sockaddr */
|
|
//};
|
|
}
|
|
|
|
|
|
return file_des;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void closeConnection(int file_des) {
|
|
//fflush(stdout);
|
|
//printf("Closing file_des %d\n", file_des);
|
|
//sleep(1);
|
|
#ifdef VERY_VERBOSE
|
|
#endif
|
|
if(file_des>=0)
|
|
close(file_des);
|
|
file_des=-1;
|
|
}
|
|
|
|
void exitServer(int socketDescriptor) {
|
|
if (socketDescriptor>=0)
|
|
close(socketDescriptor);
|
|
#ifdef VERY_VERBOSE
|
|
printf("Closing server\n");
|
|
#endif
|
|
socketDescriptor=-1;
|
|
}
|
|
|
|
|
|
|
|
|
|
int sendDataOnly(int file_des, void* buf,int length) {
|
|
|
|
|
|
return write(file_des, buf, length);
|
|
}
|
|
|
|
|
|
int receiveDataOnly(int file_des, void* buf,int length) {
|
|
|
|
int total_received=0;
|
|
int nreceiving;
|
|
int nreceived;
|
|
if (file_des<0) return -1;
|
|
#ifdef VERY_VERBOSE
|
|
printf("want to receive %d Bytes\n", length);
|
|
#endif
|
|
|
|
while(length>0){
|
|
nreceiving = (length>send_rec_max_size) ? send_rec_max_size:length;
|
|
|
|
#ifdef VERY_VERBOSE
|
|
printf("want to receive %d Bytes\n", nreceiving);
|
|
#endif
|
|
nreceived = read(file_des,(char*)buf+total_received,nreceiving);
|
|
#ifdef VERY_VERBOSE
|
|
printf("read %d \n", nreceived);
|
|
#endif
|
|
if(!nreceived) break;
|
|
// if(nreceived<0) break;
|
|
length-=nreceived;
|
|
total_received+=nreceived;
|
|
// cout<<"nrec: "<<nreceived<<" waiting for ("<<length<<")"<<endl;
|
|
}
|
|
|
|
#ifdef VERY_VERBOSE
|
|
printf("received %d Bytes\n", total_received);
|
|
#endif
|
|
|
|
if (total_received>0)
|
|
strcpy(thisClientIP,dummyClientIP);
|
|
if (strcmp(lastClientIP,thisClientIP))
|
|
differentClients=1;
|
|
else
|
|
differentClients=0;
|
|
|
|
return total_received;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int sendChannel(int file_des, sls_detector_channel *myChan) {
|
|
return sendDataOnly(file_des,myChan, sizeof(sls_detector_channel));
|
|
}
|
|
|
|
int sendChip(int file_des, sls_detector_chip *myChip) {
|
|
int ts=0;
|
|
int nChans=myChip->nchan;
|
|
ts+=sendDataOnly(file_des,myChip,sizeof(sls_detector_chip));
|
|
ts+=sendDataOnly(file_des,myChip->chanregs,nChans*sizeof(int));
|
|
return ts;
|
|
}
|
|
|
|
int sendModule(int file_des, sls_detector_module *myMod) {
|
|
int ts=0;
|
|
int idac;
|
|
int nChips=myMod->nchip;
|
|
int nChans=myMod->nchan;
|
|
int nAdcs=myMod->nadc;
|
|
int nDacs=myMod->ndac;
|
|
ts+= sendDataOnly(file_des,myMod,sizeof(sls_detector_module));
|
|
#ifdef VERBOSE
|
|
printf("module %d of size %d sent\n",myMod->module, ts);
|
|
#endif
|
|
ts+= sendDataOnly(file_des,myMod->dacs,sizeof(dacs_t)*nDacs);
|
|
#ifdef VERBOSE
|
|
printf("dacs %d of size %d sent\n",myMod->module, ts);
|
|
for (idac=0; idac< nDacs; idac++)
|
|
printf("dac %d is %d\n",idac,myMod->dacs[idac]);
|
|
#endif
|
|
ts+= sendDataOnly(file_des,myMod->adcs,sizeof(dacs_t)*nAdcs);
|
|
#ifdef VERBOSE
|
|
printf("adcs %d of size %d sent\n",myMod->module, ts);
|
|
#endif
|
|
ts+=sendDataOnly(file_des,myMod->chipregs,sizeof(int)*nChips);
|
|
#ifdef VERBOSE
|
|
printf("chips %d of size %d sent\n",myMod->module, ts);
|
|
#endif
|
|
ts+=sendDataOnly(file_des,myMod->chanregs,sizeof(int)*nChans);
|
|
#ifdef VERBOSE
|
|
printf("chans %d of size %d sent - %d\n",myMod->module, ts, myMod->nchan);
|
|
#endif
|
|
#ifdef VERBOSE
|
|
printf("module %d of size %d sent register %x\n",myMod->module, ts, myMod->reg);
|
|
#endif
|
|
return ts;
|
|
}
|
|
|
|
int receiveChannel(int file_des, sls_detector_channel *myChan) {
|
|
return receiveDataOnly(file_des,myChan,sizeof(sls_detector_channel));
|
|
}
|
|
|
|
int receiveChip(int file_des, sls_detector_chip* myChip) {
|
|
|
|
int *ptr=myChip->chanregs;
|
|
int ts=0;
|
|
int nChans, nchanold=myChip->nchan, chdiff;
|
|
|
|
ts+= receiveDataOnly(file_des,myChip,sizeof(sls_detector_chip));
|
|
|
|
|
|
myChip->chanregs=ptr;
|
|
nChans=myChip->nchan;
|
|
chdiff=nChans-nchanold;
|
|
if (nchanold!=nChans) {
|
|
printf("wrong number of channels received!\n");
|
|
}
|
|
|
|
|
|
#ifdef VERBOSE
|
|
printf("chip structure received\n");
|
|
printf("now receiving %d channels\n", nChans);
|
|
#endif
|
|
|
|
if (chdiff<=0)
|
|
ts+=receiveDataOnly(file_des,myChip->chanregs, sizeof(int)*nChans);
|
|
else {
|
|
ptr=malloc(chdiff*sizeof(int));
|
|
myChip->nchan=nchanold;
|
|
ts+=receiveDataOnly(file_des,myChip->chanregs, sizeof(int)*nchanold);
|
|
ts+=receiveDataOnly(file_des,ptr, sizeof(int)*chdiff);
|
|
free(ptr);
|
|
return FAIL;
|
|
}
|
|
|
|
#ifdef VERBOSE
|
|
printf("chip's channels received\n");
|
|
#endif
|
|
return ts;
|
|
}
|
|
|
|
int receiveModule(int file_des, sls_detector_module* myMod) {
|
|
|
|
|
|
dacs_t *dacptr=myMod->dacs;
|
|
dacs_t *adcptr=myMod->adcs;
|
|
int *chipptr=myMod->chipregs, *chanptr=myMod->chanregs;
|
|
int ts=0;
|
|
int nChips, nchipold=myMod->nchip, nchipdiff;
|
|
int nChans, nchanold=myMod->nchan, nchandiff;
|
|
int nDacs, ndold=myMod->ndac, ndacdiff;
|
|
int nAdcs, naold=myMod->nadc, nadcdiff;
|
|
|
|
|
|
ts+= receiveDataOnly(file_des,myMod,sizeof(sls_detector_module));
|
|
|
|
myMod->dacs=dacptr;
|
|
myMod->adcs=adcptr;
|
|
myMod->chipregs=chipptr;
|
|
myMod->chanregs=chanptr;
|
|
|
|
nChips=myMod->nchip;
|
|
nchipdiff=nChips-nchipold;
|
|
if (nchipold!=nChips) {
|
|
printf("received wrong number of chips\n");
|
|
}
|
|
#ifdef VERBOSE
|
|
else
|
|
printf("received %d chips\n",nChips);
|
|
#endif
|
|
|
|
nChans=myMod->nchan;
|
|
nchandiff=nChans-nchanold;
|
|
if (nchanold!=nChans) {
|
|
printf("received wrong number of channels\n");
|
|
}
|
|
#ifdef VERBOSE
|
|
else
|
|
printf("received %d chans\n",nChans);
|
|
#endif
|
|
|
|
|
|
nDacs=myMod->ndac;
|
|
ndacdiff=nDacs-ndold;
|
|
if (ndold!=nDacs) {
|
|
printf("received wrong number of dacs\n");
|
|
}
|
|
#ifdef VERBOSE
|
|
else
|
|
printf("received %d dacs\n",nDacs);
|
|
#endif
|
|
|
|
nAdcs=myMod->nadc;
|
|
nadcdiff=nAdcs-naold;
|
|
if (naold!=nAdcs) {
|
|
printf("received wrong number of adcs\n");
|
|
}
|
|
#ifdef VERBOSE
|
|
else
|
|
printf("received %d adcs\n",nAdcs);
|
|
#endif
|
|
if (ndacdiff<=0) {
|
|
ts+=receiveDataOnly(file_des,myMod->dacs, sizeof(dacs_t)*nDacs);
|
|
#ifdef VERBOSE
|
|
printf("dacs received\n");
|
|
#endif
|
|
} else {
|
|
dacptr=malloc(ndacdiff*sizeof(dacs_t));
|
|
myMod->ndac=ndold;
|
|
ts+=receiveDataOnly(file_des,myMod->dacs, sizeof(dacs_t)*ndold);
|
|
ts+=receiveDataOnly(file_des,dacptr, sizeof(dacs_t)*ndacdiff);
|
|
free(dacptr);
|
|
return FAIL;
|
|
}
|
|
if (nadcdiff<=0) {
|
|
ts+=receiveDataOnly(file_des,myMod->adcs, sizeof(dacs_t)*nAdcs);
|
|
#ifdef VERBOSE
|
|
printf("adcs received\n");
|
|
#endif
|
|
} else {
|
|
adcptr=malloc(nadcdiff*sizeof(dacs_t));
|
|
myMod->nadc=naold;
|
|
ts+=receiveDataOnly(file_des,myMod->adcs, sizeof(dacs_t)*naold);
|
|
ts+=receiveDataOnly(file_des,adcptr, sizeof(dacs_t)*nadcdiff);
|
|
free(adcptr);
|
|
return FAIL;
|
|
}
|
|
if (nchipdiff<=0) {
|
|
ts+=receiveDataOnly(file_des,myMod->chipregs, sizeof(int)*nChips);
|
|
#ifdef VERBOSE
|
|
printf("chips received\n");
|
|
#endif
|
|
} else {
|
|
chipptr=malloc(nchipdiff*sizeof(int));
|
|
myMod->nchip=nchipold;
|
|
ts+=receiveDataOnly(file_des,myMod->chipregs, sizeof(int)*nchipold);
|
|
ts+=receiveDataOnly(file_des,chipptr, sizeof(int)*nchipdiff);
|
|
free(chipptr);
|
|
return FAIL;
|
|
}
|
|
if (nchandiff<=0) {
|
|
ts+=receiveDataOnly(file_des,myMod->chanregs, sizeof(int)*nChans);
|
|
#ifdef VERBOSE
|
|
printf("chans received\n");
|
|
#endif
|
|
} else {
|
|
chanptr=malloc(nchandiff*sizeof(int));
|
|
myMod->nchan=nchanold;
|
|
ts+=receiveDataOnly(file_des,myMod->chanregs, sizeof(int)*nchanold);
|
|
ts+=receiveDataOnly(file_des,chanptr, sizeof(int)*nchandiff);
|
|
free(chanptr);
|
|
return FAIL;
|
|
}
|
|
#ifdef VERBOSE
|
|
printf("received module %d of size %d register %x\n",myMod->module,ts,myMod->reg);
|
|
#endif
|
|
return ts;
|
|
}
|