Distributed System Lab Manual NCS751 1
Distributed System Lab Manual NCS751 1
LIST OF EXPERIMENTS
2. C 406.1
Configure following options on server socket and tests them:
SO_KEEPALIVE, SO_LINGER, SO_SNDBUF,
SO_RCVBUF, TCP_NODELAY
3. SO_KEEPALIVE, SO_LINGER, SO_SNDBUF, C 406.2
Simulate the functioning
SO_RCVBUF, of Lamport‟s Logical Clock in C.
TCP_NODELAY
4. C 406.2
Simulate the Distributed Mutual Exclusion in C.
5. C 406.3
Implement a Distributed Chat Server using TCP Sockets in
C.
6. C 406.3
Implement Java RMI‟ mechanism for accessing methods of
remote systems.
7. C 406.4
Simulate Balanced Sliding Window Protocol in C.
8. C 406.5
Implement CORBA mechanism by using C++program at one
end and Java program
on the other.
10. Monitor SOAP request and response packets. Analyze parts C 406.2
of it and compare them with the operations (java functions)
headers.
INTRODUCTION
A computer program that runs within a distributed system is called a distributed program (and
distributed programming is the process of writing such programs). There are many different
types of implementations for the message passing mechanism, including pure HTTP, RPC-
like connectors and message queues.
Lamport's logical clock in distributed systems. In a distributed system, it is not possible in practice to
synchronize time across entities (typically thought of as processes) within the system; hence, the
entities can use the concept of a logical clock based on the events through which they communicate.
Concurrent access of processes to a shared resource or data is executed in mutually exclusive manner In
a distributed system, shared variables (semaphores) or a local kernel cannot be used to
implement mutual exclusion. Message passing is the sole means for implementing distributed mutual
exclusion.
TCP is a connection-oriented protocol that provides a reliable. flow of data between two
computers. Example applications that. use such services are HTTP, FTP, and Telnet.
A sliding window protocol is a feature of packet-based data transmission protocols. Sliding
window protocols are used where reliable in-order delivery of packets is required, such as in
the Data Link Layer (OSI layer 2) as well as in the Transmission Control Protocol (TCP).
Conceptually, each portion of the transmission (packets in most data link layers, but bytes in
TCP) is assigned a unique consecutive sequence number, and the receiver uses the numbers to
place received packets in the correct order, discarding duplicate packets and identifying
missing ones. The problem with this is that there is no limit on the size of the sequence number
that can be required.
CORBA is essentially a design specification for an Object Request Broker (ORB), where an
ORB provides the mechanism required for distributed objects to communicate with one another,
whether locally or on remote devices, written in different languages.
PREFACE
In order to efficient distributed computing, it is essential that student must have knowledge of
distributed network. The purpose of this laboratory manual is to introduce
undergraduate students about a computer program that runs within a distributed system
called a distributed program (and distributed programming is the process of writing such
programs). The manual serves as a guide for learning and implementing for the message
passing mechanism, including pure HTTP, RPC-like connectors and message queues It
basically focuses on functioning of Lamport’s Logical Clock and Distributed Mutual
Exclusion, simulate Balanced Sliding Window Protocol and CORBA mechanism. The manual
contains procedures, and pre-experiment questions to help students prepare for experiments.
This practical manual will be helpful for students of Computer Science & Engineering for
understanding the course from the point of view of applied aspects. Though all the efforts
have been made to make this manual error free, yet some errors might have crept in
inadvertently. Suggestions from the readers for the improvement of the manual are most
welcomed.
DO’s
DONT’S
1. Know the location of the fire extinguisher and the first aid box and how to use them in case
of an emergency.
4. Do not plug in external devices without scanning them for computer viruses.
Name
Roll No.
Section- Batch
Data Structures Using C/ Java Lab (RCS-355) Manual (CS, III SEM) Page 16
Department of Computer Science & Engineering
INDEX
Experiment Experiment Date of Date of Faculty
No. Name Conduction Submission Signature
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 15
Department of Computer Science & Engineering
EXPERIMENT - 1
Algorithm:
Server side programming Algorithm
STEP 1: Start the program.
STEP 2: Declare the variables and structure for the socket..
STEP 3: The socket is binded at the specified port.
STEP 4: Using the object the port and address are declared.
STEP 5: The listen and accept functions are executed.
STEP 6: If the binding is successful it waits for client request.
STEP 7: Execute the client program.
.
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 16
Department of Computer Science & Engineering
Pre-Experiment Questions:
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 17
Department of Computer Science & Engineering
EXPERIMENT - 2
Description:
Th is important with TCP because the connected socket is not returned to a server by accept until
the three-way handshake is completed by the TCP layer. To ensure that one of these socket
options is set for the connected socket when the three-way handshake completes, we must set
that option for the listening socket.
There are various ways to get and set the options that affect a socket:
Pre-Experiment Questions:
Procedure:
Write a server(TCP) C Program that sets the socket options using stockpot on server one by one
and displays the information using getsockopt.
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 18
Department of Computer Science & Engineering
Program:
Server program:
#include <unistd.h>
#include <stdio.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <string.h>
#define PORT 8080
int main(int argc, char const *argv[])
{
int server_fd, new_socket, valread;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
char buffer[1024] = {0};
char *hello = "Hello from server";
exit(EXIT_FAILURE);
}
if ((new_socket = accept(server_fd, (struct sockaddr *)&address,
(socklen_t*)&addrlen))<0) }
perror("accept");
exit(EXIT_FAILURE);
}
valread = read( new_socket , buffer, 1024);
printf("%s\n",buffer );
send(new_socket , hello , strlen(hello) , 0 );
printf("Hello message sent\n");
return 0;
}
Cient program:
#include <stdio.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <string.h>
#define PORT 8080
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 20
Department of Computer Science & Engineering
{
printf("\nInvalid address/ Address not supported \n");
return -1;
}
Post-Experiment Questions:
Q1. Exchanging one hello message between server and client to demonstrate the
client/server model.
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 21
Department of Computer Science & Engineering
EXPERIMENT - 3
Descriptions:
The algorithm of Lamport timestamps is a simple algorithm used to determine the order of events
in a distributed computer system. As different nodes or processes will typically not be perfectly
synchronized, this algorithm is used to provide a partial ordering of events with minimal
overhead, and conceptually provide a starting point for the more advanced vector clock method.
They are named after their creator, Leslie Lamport.
Distributed algorithms such as resource synchronization often depend on some method of
ordering events to function. For example, consider a system with two processes and a disk. The
processes send messages to each other, and also send messages to the disk requesting access. The
disk grants access in the order the messages were sent. For example process {\displaystyle
A} sends a message to the disk requesting write access, and then sends a read instruction message
to process {\display style B}Process {\display style B} receives the message, and as a result
sends its own read request message to the disk. If there is a timing delay causing the disk to
receive both messages at the same time, it can determine which message happened-before the
other: {\display style A} happens-before {\displaystyle B} if one can get from {\displaystyle
A} to {\display style B} by a sequence of moves of two types: moving forward while remaining
in the same process, and following a message from its sending to its reception. A logical clock
algorithm provides a mechanism to determine facts about the order of such events.
Pre-Experiment Questions:
Q1. Explain Time stamp.
Algorithms:
1. A process increments its counter before each event in that process,When a process sends a
message, it includes its counter value with the message;
2. On receiving a message, the counter of the recipient is updated, if necessary, to the greater
of its current counter and the timestamp in the received message.
3. The counter is then incremented by 1 before the message is considered received.
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 22
Department of Computer Science & Engineering
Program:
#include<stdio.h>
#include<conio.h>
#include<iostream.h>
#include<stdlib.h>
#include<graphics.h>
#include<string.h>
#include<dos.h>
void main(){
int s[4][9],n,m=0;
int i,j,next=0,step=0;
int msg[10][4]={0},totmsg;
char op;
int pi,pj,ei,ej;
clrscr();
cout<<“\nProgram for Lamport Logical Clock”;
cout<<“\nEnter Number Of Process “;
cin>>n;
for(i=0;i<n;i++){
cout<<“\nEnter number of STATES of process P”<<i<<” “;
cin>>s[i][8];
for(j=1;j<=s[i][8];j++){
s[i][j]=j;
}
}
do{
cout<<“\nEnter message transit”;
cout<<“\nFROM ->\nEnter Process Number P”;
cin>>msg[m][0];
cout<<“\nEnter Event Number e”;
cin>>msg[m][1];
cout<<“\nTO ->\nEnter Process Number P”;
cin>>msg[m][2];
cout<<“\nEnter Event Number e”;
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 23
Department of Computer Science & Engineering
cin>>msg[m][3];
cout<<“\n\nPress ‘y’ to continue”;
op=getch();
cout<<op;
m++;
totmsg=m;
}while(op==’y’);
m=0;
for (i=0;i<totmsg;i++){
pi=msg[i][0];
ei=msg[i][1];
pj=msg[i][2];
ej=msg[i][3];
if(s[pj][ej]< (s[pi][ei]+1)){
s[pj][ej]=s[pi][ei]+1;
for (j=ej+1;j<=s[pj][8];j++){
s[pj][j]=s[pj][j-1]+1;
}
}
}
int gd=DETECT,gm;
initgraph(&gd,&gm,”C:\\TC\\BGI”);
outtextxy(200,15,”Program For Lamport Logical Clock”);
//drawing process and events
for(i=0;i<n;i++){
char* p1;
itoa(i,p1,10);
outtextxy(5,100+next,”P”);
outtextxy(13,100+next,p1);
line(100,100+next,600,100+next);
for(j=1;j<=s[i][8];j++){
char* p2;
itoa(j,p2,10);
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 24
Department of Computer Science & Engineering
outtextxy(100+step,90+next,”e”);
outtextxy(110+step,90+next,p2);
//timestamp
char* p3;
itoa(s[i][j]-1,p3,10);
outtextxy(100+step,110+next,”t”);
outtextxy(110+step,110+next,p3);
circle(105+step,100+next,5);
step+=50;
}
step=0;
next+=100;
}
delay(2000);
//drawing message transit
for(m=0;m<totmsg;m++){
setlinestyle(SOLID_LINE,1,3);
setcolor(m+4);
line(msg[m][1]*50+50,msg[m][0]*100+100,msg[m][3]*50+50,msg[m][2]*100+100);
if (msg[m][2]>msg[m][0]){
line(msg[m][3]*50+50,msg[m][2]*100+100,msg[m][3]*50+50,msg[m][2]*100+90);
line(msg[m][3]*50+50,msg[m][2]*100+100,msg[m][3]*50+40,msg[m][2]*100+90);
}
else{
line(msg[m][3]*50+50,msg[m][2]*100+100,msg[m][3]*50+50,msg[m][2]*100+110);
line(msg[m][3]*50+50,msg[m][2]*100+100,msg[m][3]*50+40,msg[m][2]*100+110);
}
}
getch();
}
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 25
Department of Computer Science & Engineering
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 26
Department of Computer Science & Engineering
EXPERIMENT 4
Pre-Experiment Question:
Algorithms :
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 27
Department of Computer Science & Engineering
Program:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void *functionC();
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
int counter = 0;
main()
{
int rc1, rc2;
pthread_t thread1, thread2;
/* Create independent threads each of which will execute functionC */
if( (rc1=pthread_create( &thread1, NULL, &functionC, NULL)) )
{
printf("Thread creation failed: %d\n", rc1);
}
if( (rc2=pthread_create( &thread2, NULL, &functionC, NULL)) )
{
printf("Thread creation failed: %d\n", rc2);
}
/* Wait till threads are complete before main continues. Unless we */
/* wait we run the risk of executing an exit which will terminate */
/* the process and all threads before the threads have completed. */
pthread_join( thread1, NULL);
pthread_join( thread2, NULL);
exit(0);
}
void *functionC()
{
pthread_mutex_lock( &mutex1 );
counter++;
printf("Counter value: %d\n",counter);
pthread_mutex_unlock( &mutex1 );
}
Compile: cc -lpthread mutex1.c Run: ./a.out Results:
Counter value: 1 Counter value: 2
join1.c
#include <stdio.h>
#include <pthread.h>
#define NTHREADS 10
void *thread_function(void *);
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
int counter = 0;
main()
{
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 28
Department of Computer Science & Engineering
pthread_t thread_id[NTHREADS];
int i, j;
for(i=0; i < NTHREADS; i++)
{
pthread_create( &thread_id[i], NULL, thread_function, NULL );}
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 29
Department of Computer Science & Engineering
void *functionCount1();
void *functionCount2();
int count = 0;#define COUNT_DONE 10
#define COUNT_HALT1 3
#define COUNT_HALT2 6
main()
{
pthread_t thread1, thread2;
pthread_create( &thread1, NULL, &functionCount1, NULL);
pthread_create( &thread2, NULL, &functionCount2, NULL);
pthread_join( thread1, NULL);
pthread_join( thread2, NULL);
printf("Final count: %d\n",count);
exit(0);}
for(;;)
{
pthread_mutex_lock( &count_mutex );
if( count < COUNT_HALT1 || count > COUNT_HALT2 )
{
// Condition of if statement has been met.
// Signal to free waiting thread by freeing the mutex.
// Note: functionCount1() is now permitted to modify "count".
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 30
Department of Computer Science & Engineering
pthread_cond_signal( &condition_var );
}
else
{
count++;
printf("Counter value functionCount2: %d\n",count);
}
pthread_mutex_unlock( &count_mutex );
if(count >= COUNT_DONE) return(NULL);
}
}
Compile: cc -lpthread cond1.c Run: ./a.out Results:
Counter value functionCount1: 1
Counter value functionCount1: 2
Counter value functionCount1: 3
Counter value functionCount2: 4
Counter value functionCount2: 5
Counter value functionCount2: 6
Counter value functionCount2: 7
Counter value functionCount1: 8
Counter value functionCount1: 9
Counter value functionCount1: 10
Final count: 10
.
Post-Experiment Questions
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 31
Department of Computer Science & Engineering
EXPERIMENT – 5
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 32
Department of Computer Science & Engineering
{
extern int make_socket (uint16_t port);
int sock;
fd_set active_fd_set, read_fd_set;
int i;
struct sockaddr_in clientname;
size_t size;
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 33
Department of Computer Science & Engineering
{
perror ("accept");
exit (EXIT_FAILURE);
}
fprintf (stderr,
"Server: connect from host %s, port %hd.\n",
inet_ntoa (clientname.sin_addr),
ntohs (clientname.sin_port));
FD_SET (new, &active_fd_set);
}
else
{
/* Data arriving on an already-connected socket. */
if (read_from_client (i) < 0) {
close (i);
FD_CLR (i, &active_fd_set);
}}}}}
Post-Experiment Questions:
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 34
Department of Computer Science & Engineering
EXPERIMENT – 6
Aim: Implement Java RMI mechanism for accessing methods of remote systems.
Descriptions:
RMI stands for Remote Method Invocation. It is a mechanism that allows an object residing in
one system (JVM) to access/invoke an object running on another JVM.
RMI is used to build distributed applications; it provides remote communication between Java
programs. It is provided in the package java.rmi.
Algorithm :
import java.rmi.*;
import java.rmi.server.*;
public class Hello extends UnicastRemoteObject implements HelloInterface {
private String message;
public Hello (String msg) throws RemoteException {
message = msg;
}
public String say() throws RemoteException {
return message;
}
}
HelloClient.java
import java.rmi.Naming;
public class HelloClient
{
public static void main (String[] argv) {
try {
HelloInterface hello =(HelloInterface) Naming.lookup ("//192.168.10.201/Hello");
System.out.println (hello.say());
}
catch (Exception e){
System.out.println ("HelloClient exception: " + e);}
}
}
HelloInterface.java
import java.rmi.*;
public interface HelloInterface extends Remote {
public String say() throws RemoteException;
}
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 35
Department of Computer Science & Engineering
HelloServer.java
import java.rmi.Naming;
public class HelloServer}
{
System.out.println ("Server not connected: " + e);
}
}
}
Post-Experiment Questions:
Q1. What is the use of RMI registry?
Q2. What is meant by distributed garbage collection?
Q3. Explain the use of Reflection in RMI?
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 36
Department of Computer Science & Engineering
EXPERIMENT - 7
Descriptions:
A sliding window protocol is a feature of packet-based data transmission protocols. Sliding
window protocols are used where reliable in-order delivery of packets is required, such as in
the Data Link Layer (OSI layer 2) as well as in the Transmission Control Protocol (TCP).
Conceptually, each portion of the transmission (packets in most data link layers, but bytes in
TCP) is assigned a unique consecutive sequence number, and the receiver uses the numbers to
place received packets in the correct order, discarding duplicate packets and identifying
missing ones. The problem with this is that there is no limit on the size of the sequence number
that can be required.
Program:
#include <STDIO.H>
#include <iostream.h>
#include <string>
#define THANKS -1
void main()
{
FILE *r_File1;
FILE *w_File2;
int m_framecount;
int frameCount = 0;
long currentP = 0;
long sentChar = 0;
long recvedChar = 0;
char s_name[100];
char d_name[100];
char *sp = s_name;
char *dp = d_name;
int slidingWin;
int frameSize;
int dataSize;
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 37
Department of Computer Science & Engineering
int n_flag;
};
FRAME frame;
frame.s_flag = 126;//set start flag
frame.n_flag = 126;//set end flag
memset(frame.data, 0, 91);//use 0 to fill full the member array in structure frame.
struct ACK{
int s_flag;
int nextSeq;
int n_flag;
}ack;
//initialize start flag and end flag in structure ack.
ack.s_flag = 126;
ack.n_flag = 126;
ack.nextSeq = NULL;
//ask user to enter file name and size of sliding window.
lable1 : cout <<"Please enter source file's name!"<<endl;
cin >> sp;
cout <<"Please enter destination file's name!"<<endl;
cin >> dp;
lable2: cout <<"Please chose size of sliding window 2--7"<<endl;
cin >> slidingWin;
if((slidingWin >7 )| (slidingWin < 2))
{
cout << "wrong enter"<<endl;
goto lable2;
}
lable3: cout<< "Please enter the size of frame 14--101 Only!" << endl;
cin >>frameSize;
if((frameSize > 101) | (frameSize < 14))
{ cout << "please enter right number!"<< endl;
goto lable3;
}
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 38
Department of Computer Science & Engineering
{
cout << "THE PROCESS ON SENDER SIDER..."<<endl;
//open a source file by read mode.
if((r_File1 = fopen(sp, "rb")) == NULL)
cout << "source file could not be opened please check it and re-start!" <<endl;
goto lable1;
}
else
{
cout<<"Opening a file for read...";
cout <<endl;
cout <<endl;
//after open the file, use fseek to resume the last position of a file pointer.
//Then start to read from that position.
fseek(r_File1,currentP,SEEK_SET);
//start loop for create frame array
for (int i = 0; i < slidingWin ; i++)// i is the frame array's index
{
frame.sequenceNo = seqNo;
if ((seqNo >= 7) == true)
{
seqNo = 0;//set sequencce number
}
else
{
seqNo = seqNo +1;
}
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 39
Department of Computer Science & Engineering
//This loop is used to fill the characters read from opened file to char array data which
//is a memeber of structure frame.
//we have to reseve a byte for \0 which is used to identify the end of the data array.
//that means each time we only read datasize -1 characters to the data array.
for (int j = 0; j < dataSize -1; j++)
{ //if it is not end of file read a character from file then save it into data
//field in frame structure.
frame.data[j]= fgetc(r_File1);
sentChar++;//calculate how many characters will be sent.*/
if (frame.data[j]
{
cout<< "There is the end of file"<<endl;
isEnd = true;
//sentChar++;
break;
}
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 40
Department of Computer Science & Engineering
//cout << "frame " << pf[i].sequenceNo <<" has been transported!";
cout<< endl;
currentP = ftell(r_File1);//to record the current position of a file pointer
}
fflush(r_File1);//refresh
}
int nextNoRecord = 0;
cout<<"THE PROCESS ON RECEIVER SIDE..."<<endl;
//open a file for write
if((w_File2 = fopen(dp, "ab")) != NULL)
{
cout<<"opening a file for write..."<<endl;
for (int m = 0; m < m_framecount ; m++)
{
for (int n = 0; n < dataSize -1; n++)
{//check whether islast character.
if(pf[m].data[n]
{
ack.nextSeq = THANKS;
//fputc(pf[m].data[n],w_File2);
recvedChar++;
break
}
//write the character from current frame 's which in t index of data flied.
fputc(pf[m].data[n],w_File2);
recvedChar++;
}
cout << "The string ---->" << pf[m].data <<" written succeed"<<endl;
fflush(w_File2);//refresh
if(ack.nextSeq == THANKS)
{
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 41
Department of Computer Science & Engineering
fclose(w_File2);
break;
}
nextNoRecord= pf[m].sequenceNo;
}
cout <<endl;
cout <<"Total "<<recvedChar << " characters have been received on this session"<<endl;
cout <<endl;
cout << "send acknowledgement!" <<endl;
cout <<endl;
cout <<endl;
if (ack.nextSeq != THANKS)
{
cout<<"CheckACK"<<endl;
if (nextNoRecord
{
ack.nextSeq =0 ;
}
else
{
ack.nextSeq = nextNoRecord +1;
}
cout << "The next expect frame is " << ack.nextSeq <<endl;
}
else
{ cout<<"CheckACK"<<endl;
cout << "The acknowledgement is thanks. The transmission complete..."<<endl;
//delete the frame buffer array .
delete []pf;
}
}
else
{cout << "File could not be opened" << endl;}
cout <<endl;
cout <<endl;
}
/*can be used to check how many bytes in the specified fill
numRead = 0;
fseek(r_File1,0,SEEK_END);
numRead = ftell(r_File1);
cout << "There are " << numRead <<" Bytes in the file" << endl;*/
}
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 42
Department of Computer Science & Engineering
►OUTPUT
1: use fixed source file name and fixed destination file name and fixed sliding
Post-Experiment Questions:
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 43
Department of Computer Science & Engineering
EXPERIMENT - 8
Aim: Implement CORBA mechanism by using „C++‟ program at one end and „Java‟ program
on the other.
Description:
CORBA is essentially a design specification for an Object Request Broker (ORB), where an
ORB provides the mechanism required for distributed objects to communicate with one another,
whether locally or on remote devices, written in different languages, or at different locations on
a network.
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 44
Department of Computer Science & Engineering
Program:
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 45
Department of Computer Science & Engineering
// Activate object
PortableServer::ObjectId_var myObjID =myPOA->activate_object(CrypImpl);
// Get a CORBA reference with the POA through the servant
CORBA::Object_var o = myPOA->servant_to_reference(CrypImpl);// The reference is
converted to a character string
CORBA::String_var s = orb->object_to_string(o);
cout << "The IOR of the object is: " << s.in() << endl;
CosNaming::Name name;
name.length(1);
name[0].id = (const char *) "CryptographicService";
name[0].kind = (const char *) "";
// Bind the object into the name service
nc->rebind(name,o);
// Activate the POA
manager->activate();
cout << "The server is ready.
Awaiting for incoming requests..." << endl;
// Start the ORB
orb->run();
} catch(const CORBA::Exception& e) {
// Handles CORBA exceptions
cerr << e << endl;
}
// Decrement reference count
if (CrypImpl)
CrypImpl->_remove_ref();
// End CORBA
if (!CORBA::is_nil(orb)){
try{
orb->destroy();
cout << "Ending CORBA..." << endl;
} catch (const CORBA::Exception& e)
{
cout << "orb->destroy() failed:" << e << endl;
return 1;
}
}
return 0;
}
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 46
Department of Computer Science & Engineering
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 47
Department of Computer Science & Engineering
if (cin.fail())
{
cin.clear();
cin >> dummy;
}
cout << "Enter a shift: ";
cin >> shift;
} while (cin.fail());
// Used for debug pourposes
//key = 9876453;
//shift = 938372;
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 48
Department of Computer Science & Engineering
}catch(const CORBA::Exception& e) {
// Handles CORBA exceptions
cerr << e << endl;
}
// End CORBA
if (!CORBA::is_nil(orb)){
try{
orb->destroy();
cout << "Ending CORBA..." << endl;
} catch(const CORBA::Exception& e)
{
cout << "orb->destroy failed:" << e << endl;
return 1;
}
}
return 0;
}
►OUTPUT
Running the Client-server Application Once we have implemented the client and the server,
it‟s time to connect them. Because our demonstration client and server exchange object
references via the naming service, we must ensure that the naming service (which is called
nameserv in Orbacus) is running. We use some command-line options to tell the naming
service the host and port on which it should listen. nameserv -OAhost localhost -OAport 8140
After this, we can start the server with a command-line option to tell it how to contact the
naming service. server -ORBInitRef NameService=corbaloc:iiop:localhost:8140/NameService
Finally we can start the client, again with a command-line option to tell it how to contact the
naming service. client -ORBInitRef NameService=corbaloc:iiop:localhost:8140/NameService
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 49
Department of Computer Science & Engineering
EXPERIMENT - 9
Algorithm
1) Write a server C Program using Shared memory and semaphore (server increments
counter between sem_wait and sem_post). Create shared memory using mmap.
2) Write a client C Program that reads counter value between sem_wait and sem_post.
Access shared memory using open.
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 50
Department of Computer Science & Engineering
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 51
Department of Computer Science & Engineering
EXPERIMENT – 10
Aim: Monitor SOAP request and response packets. Analyze parts of it and compare them with
the operations (java functions) headers.
Algorithm
1) Start WS-Monitor on port 4040 and forwarding port 808
2) Change the service target port from 8080 to 4040
3) WS-Monitor will capture SOAP request and SOAP response.
4) Study request and response packets and try to relate them with operation name,
service name, namespace, etc.
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 52
Department of Computer Science & Engineering
APPENDIX
AKTU SYLLABUS
7. Implement CORBA mechanism by using ‘C++’ program at one end and ‘Java program on the
other.
Distributed System Lab (NCS 751) Manual (CS, VII SEM) Page 53