if (result == pid)
{
/* Create a new socket for communicating the job finlaization */
answ_sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
/* Send some data to the client to indicate that the job was finished */
printf("(TServerJobControl) Sending application termination data to the LRS (%d)...\n", pid);
temp_port = clnt_addr.sin_port;
clnt_addr.sin_port = htons(LRS_RECV_PORT);
//outData.type = JOB_FINISHED;
//outData.data.execData.pid = pid;
/* This method of sending just once should be changed by something more secure... */
/* If we do this, the TRunningJobs have to be changed so that it can answer for this securer method. */
/* Besides a new socket must be created so that we can listen the ack from the LRS. This 'sock' must not be used */
done = 0;
nblocking(answ_sock);
while (!done)
{
int valret;
struct timeval tv;
/* Set the data type and job pid */
outData.type = JOB_FINISHED;
outData.data.execData.pid = pid;
rst = sendto(answ_sock, &outData, sizeof(outData), 0, (struct sockaddr *)&clnt_addr, (socklen_t)sizeof(clnt_addr));
printf("(TServerJobControl) Sending application termination data to the LRS (PID:%d/RST:%d)...\n",
pid, rst);
if (rst < 0) perror("(TServerJobControl) Sending application finalization notification failed!!!");
else
{
fd_set readfds;
/* Sleep for a while, so that we let the answer to come */
// sleep(2); commented by matt
FD_ZERO(&readfds);
tv.tv_sec=2;
tv.tv_usec=0;
/* Now, try to get the LoRaS confirmation */
printf("(TServerJobControl) Waiting for the 'application termination' confirmation from LRS (%d)...\n", pid);
fromlen = sizeof(struct sockaddr_in);
// ugly patch by matt
// x = 1;
FD_SET(answ_sock,&readfds);
// while (x<=5 && x!=0) {
valret=select(FD_SETSIZE,&readfds,NULL,NULL,&tv);
if (FD_ISSET(answ_sock,&readfds)) {
printf("(TServerJobControl) Ready to send\n");
x=0;
} else {
printf("(TServerJobControl) ERROR not ready to send\n");
x++;
}
// }
x=0;
while ((rst = recvfrom(answ_sock, &outData, sizeof(outData), 0, (struct sockaddr *)&answ_addr, (socklen_t *)&fromlen)) == EAGAIN && x
{
x++;
printf("(TServerJobControl) 'Application termination' notification still not recevied after %d tries...\n", x);
FD_ZERO(&readfds);
FD_SET(answ_sock,&readfds);
valret=select(FD_SETSIZE,&readfds,NULL,NULL,NULL);
// sleep(TIME_LIMIT);
}
if (rst > 0)
{
if (outData.type == JOB_FINISHED && outData.data.execData.pid == pid)
{
printf("(TServerJobControl) 'Application termination' notification received from the LRS (%d)...\n",
outData.data.execData.pid);
done = 1;
}
else if (outData.type == NON_RUNNING_JOB)
{
printf("(TServerJobControl) 'Application termination' notification received from the LRS, but it appears that the job is not ye outData.data.execData.pid);
}
else printf("(TServerJobControl) 'Application termination' notification ERROR: received data does not match the sent one (%d/%d)\n pid, outData.data.execData.pid);
}
else
{
printf("(TServerJobControl) 'Application termination' notification ERROR: receive error (%d)\n", rst);
perror("(TServerJobControl) 1-receive error:");
}
}
}